【问题标题】:Pick out first non missing element by row逐行挑出第一个非缺失元素
【发布时间】: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% "[^&amp;]", .(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


【解决方案1】:

避免像瘟疫一样的 R 中的行操作。在这里我可能会这样做:

data[, lapply(.SD, sub, pattern = "^&*$", replacement = ""), .SDcols = x:y][
     , as.matrix(.SD)[.SD != ""]]
#[1] "25&&&35&&1" "1"          "&&&&2"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-21
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多