【发布时间】:2017-01-26 15:27:56
【问题描述】:
假设我想做以下事情:
1) 应用一些功能,将不需要的字符逐行替换为空格; 2)然后它逐行(从原始数据中)挑选出第一个非空元素(根据上面的转换)。
这是我现在拥有的:
library(data.table)
data<-data.table(x=c("25&&&35&&1","&&&&","&&&&"),
y=c("&&&&&","1","&&&&2"),
z=c("&&&&&","","1"))
function_select<-function(x){
x[gsub("&","",x)!=""][1]
}
data[,function_select(unlist(.SD)),.SDcols=c("x","y"),by=1:nrow(data)]
nrow V1
1: 1 25&&&35&&1
2: 2 1
3: 3 &&&&2
我有大约 7000 万行,我有两个问题: 1)使用data.table是否有更快的解决方案; 2) 我可以使用 parLapply 的想法加快计算速度吗?
【问题讨论】:
-
您应该显示预期的输出。第一个字符是通过
substring选择的,而不是[1],所以也许你想要melt(data[, r := .I][, c("r","x","y")], id="r")[value %like% "[^&]", .(variable = first(variable), char = substring(first(value), 1L, 1L)), by=r] -
@Frank 谢谢,我编辑了这个问题,这是我想要的第一个非空元素
-
@akrun 会更快吗?我看不出你的答案和主要答案有很大区别
-
@akrun 我也有点不懂,为什么要转置!
-
转置是有意义的,因为您正在执行按行操作,这在 R 中非常笨拙,尤其是在 data.table 中。如果您转置,则可能会遍历列,这不太糟糕。一般来说,我认为 data.table 最适合处理长格式数据的分组操作,例如
melt(data[, r := .I], id="r")
标签: r parallel-processing data.table