我需要在一些巨大的XML文件中找到并组合信息(doc < - xmlInternalTreeParse(file.name,useInternalNodes = TRUE,trim = TRUE)导致我的16GB计算机在完成之前开始交换到磁盘),并且遵循了良好的指令在http://www.omegahat.org/RSXML/Overview.html上.
从那里添加示例,这或多或少是我的文件的样子:
<?xml version="1.0" ?>
<TABLE>
<SCHOOL>
<NAME> School1 </NAME>
<GRADES>
<STUDENT> Fred </STUDENT>
<TEST1> 66 </TEST1>
<TEST2> 80 </TEST2>
<FINAL> 70 </FINAL>
</GRADES>
<TEAMS>
<SOCCER> SoccerTeam1 </SOCCER>
<HOCKEY> HockeyTeam1 </HOCKEY>
</TEAMS>
</SCHOOL>
<SCHOOL>
<NAME> School2 </NAME>
<GRADES>
<STUDENT> Wilma </STUDENT>
<TEST1> 97 </TEST1>
<TEST2> 91 </TEST2>
<FINAL> 98 </FINAL>
</GRADES>
<TEAMS>
<SOCCER> SoccerTeam2 </SOCCER>
</TEAMS>
</SCHOOL>
</TABLE>
Run Code Online (Sandbox Code Playgroud)
我需要为每个学校的学生列出曲棍球队和队名.示例中所需的输出应为"Fred","HockeyTeam1","School1".真实的例子有成千上万的"学校","曲棍球队"和"球员".
如何使用xmlEventParse解析文件以提取信息?我试图从文件中提取所有文本字段,但经过几个小时的等待后仍然没有输出.注意:真实文件比这更嵌套,因此不需要步骤固定级别来查找信息.
我需要计算每行的加权平均值(6M +行),但这需要很长时间.带权重的列是字符字段,因此加权.不能直接使用.
后台数据:
library(data.table)
library(stringr)
values <- c(1,2,3,4)
grp <- c("a", "a", "b", "b")
weights <- c("{10,0,0,0}", "{0,10,0,0}", "{10,10,0,0}", "{0,0,10,0}")
DF <- data.frame(cbind(grp, weights))
DT <- data.table(DF)
string.weighted.mean <- function(weights.x) {
tmp.1 <- na.omit(as.numeric(unlist(str_split(string=weights.x, pattern="[^0-9]+"))))
tmp.2 <- weighted.mean(x=values, w=tmp.1)
}
Run Code Online (Sandbox Code Playgroud)
以下是使用data.frames完成(太慢)的方法:
DF$wm <- mapply(string.weighted.mean, DF$weights)
Run Code Online (Sandbox Code Playgroud)
这样做的工作太慢了(几个小时):
DT[, wm:=mapply(string.weighted.mean, weights)]
Run Code Online (Sandbox Code Playgroud)
如何改写最后一行来加快速度?
我使用fread导入非常大的.CSV文件。有些列在我需要删除的文本后面有空格。这会花费太多时间(小时)。
以下代码可以工作,但是system.time上的命令非常慢(在我的计算机上大约为12秒,而实际文件要大得多)。
library(data.table)
library(stringr)
# Create example-data
df.1 <- rbind(c("Text1 ", 1, 2), c("Text2 ", 3, 4), c("Text99 ", 5, 6))
colnames(df.1) <- c("Tx", "Nr1", "Nr2")
dt.1 <- data.table(df.1)
for (i in 1:15) {
dt.1 <- rbind(dt.1, dt.1)
}
# Trim the "Tx"-column
dt.1[, rowid := 1:nrow(dt.1)]
setkey(dt.1, rowid)
system.time( dt.1[, Tx2 :={ str_trim(Tx) }, by=rowid] )
dt.1[, rowid:=NULL]
dt.1[, Tx:=NULL]
setnames(dt.1, "Tx2", "Tx")
Run Code Online (Sandbox Code Playgroud)
有没有更快的方法来修剪data.tables中的空格?
我需要进行超过1500万次的行操作,但代码太慢.这是一个可重复的小例子:
costMatrix1 <- rbind(c(4.2,3.6,2.1,2.3),c(9.6,5.5,7.2,4.9),c(2.6,8.2,6.4,8.3),c(4.8,3.3,6.8,5.7))
costMatrix2 <- costMatrix1 #Example, the costMatrix2 is actually different from costMatrix1
tbl_Filter <- rbind(c(0,0,0,4),c(1,2,3,4),c(1,0,3,0),c(1,2,0,0),c(1,2,0,4))
tbl_Sums <- data.frame(matrix(0, nrow=10, ncol=2))
colnames(tbl_Sums) <- c("Sum1","Sum2")
for (i in 1:nrow(tbl_Filter))
{
tbl_Sums[i,1] <- sum(costMatrix1[tbl_Filter[i,],tbl_Filter[i,]])
tbl_Sums[i,2] <- sum(costMatrix2[tbl_Filter[i,],tbl_Filter[i,]])
}
Run Code Online (Sandbox Code Playgroud)
我认为用ddply替换for循环是解决方案,但我无法让它工作.
首先,让我感谢所有为Stackoverflow和R做出贡献的人!我是那些不太擅长编程的R用户之一,但勇敢地尝试将它用于工作,所以下面的问题可能是微不足道的......
这是问题所在.我需要将JSON格式的文件导入R:
# library(plyr)
# library(RJSONIO)
# lstJson <- fromJSON("JSON_test.json") #This is the file I read
# dput(lstJson) #What I did to get the txtJson below, for the benefit of testing.
txtJson <- structure(list(version = "1.1", result = structure(list(warnings = structure(list(), class = "AsIs"), fields = list(structure(list(info = "", rpl = 15, name = "time", type = "timeperiod"), .Names = c("info", "rpl", "name", "type")), structure(list(info = "", name = "object", type = "string"), .Names = c("info", "name", "type")), structure(list(info = …Run Code Online (Sandbox Code Playgroud) 我有或多或少看起来像这样的数据(不知道如何粘贴图):
library(reshape2)
library(ggplot2)
df <- cbind(runif(2000,0,1000), rep(0,n=2000))
for (i in 1:nrow(df)) {
df[i,2] <- runif(1, df[i,1], (10000-2*df[i,1]))
}
colnames(df) <- c("x","y")
df.1 <- melt(data.frame(df), id="x")
p <- ggplot(df.1, aes(x=x, y=value))
p <- p + geom_point()
p <- p + geom_smooth()
p
Run Code Online (Sandbox Code Playgroud)
而不是显示的平滑线,我需要在底部5%的一条直线和在顶部95%的一条直线.一个问题是我有数百万点,所以我认为data.table是一个很好的前进方式:
library(data.table)
dt <- data.table(df)
dt[,xbin:=0]
for (i in 0:100) {
x1 <- i*100
x2 <- (i+1)*100
dt[x>=x1 & x<x2, xbin:=x2]
}
setkey(dt,xbin)
result1.dt <- dt[,list(ymin=min(y), ymax=max(y)), by=key(dt)]
result1.df <- data.frame(result1.dt)
p <- p + geom_line(data=result1.df, aes(x=xbin, y=ymin))
p …Run Code Online (Sandbox Code Playgroud) 我需要创建一个向量,其中所有数字都在表中定义的范围内.例如,行23:25和34:39将成为单个向量c(23, 24, 25, 34, 35, 36, 37, 38, 39)
下面的MWE做到了这一点,但速度太慢了.我需要做15,000,000或更高的n.rows.
row.references是输入.row.references.long是想要的输出.
有什么更好的代码来做到这一点?
library(data.table)
# Create example data
n.rows <- 1000
row.references <- data.table(start.number=floor(runif(n=n.rows, min=1, max=100)), steps=floor(runif(n=n.rows, min=1, max=50)))
row.references[, end.number:=start.number+steps]
row.references[, steps:=NULL]
row.references.long <- NULL
# The too-slow code
for (i in 1:nrow(row.references)) {
row.references.long <- rbind(row.references.long, data.table(row.references[i, start.number]:row.references[i, end.number]))
}
Run Code Online (Sandbox Code Playgroud)
我想data.table是要走的路.
如以下 MWE 所示,香蕉数量处的 NA 如何变为空白而不是显示“NA”?我希望数字列像字符列一样工作(请参阅 MWE 中的苹果颜色)。
library(data.table)
library(flextable)
the.data <- data.table(Fruit=c("Apples", "Oranges", "Bananas", "Pears"), Amount=c(4L, 8L, NA_integer_, 2L), Color=c(NA_character_, "Orange", "Yellow", "Green"))
the.ft <- flextable(the.data)
the.ft
Run Code Online (Sandbox Code Playgroud)
一种方法是将数字列转换为字符,但也许有更好的方法。