R 按行挑出第一个未丢失的元素

R 按行挑出第一个未丢失的元素,r,parallel-processing,data.table,R,Parallel Processing,Data.table,假设我要执行以下操作: 1) 应用一些函数,用空格逐行替换不需要的字符; 2) 然后它(从原始数据中)逐行挑选出第一个非空元素(根据上面的转换) 以下是我现在拥有的: library(data.table) data<-data.table(x=c("25&&&35&&1","&&&&","&&&&"), y=c("&&&&

假设我要执行以下操作:

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
库(data.table)

数据避免R中的按行操作,如瘟疫。在这里,我可能会:

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

您应该显示预期的输出。第一个字符是通过
子字符串选择的,而不是
[1]
,因此您可能希望
melt(data[,r:=.I][,c(“r”,“x”,“y”)],id=“r”)[value%like%”[^&],(variable=first(variable),char=substring(first(value),1L,1L)),by=r]
@弗兰克谢谢,我编辑了这个问题,它是第一个非空元素,我want@akrun那会更快吗?我看不出你的和梅因有什么不同answer@akrun我也有点不明白,为什么我们需要转置!转置是有意义的,因为您正在执行行操作,这在R中尤其是在data.table中非常笨拙。如果进行转置,则可以在列上进行迭代,这就不那么糟糕了。通常,我认为data.table最适合处理长格式数据的分组操作,比如
melt(data[,r:=.I],id=“r”)