R 将函数按行应用于data.table
最后我得到了一个bigdata.table,我希望每行应用一个函数。它适用于data.frame和apply,但我想用data.table获得一个解决方案R 将函数按行应用于data.table,r,data.table,R,Data.table,最后我得到了一个bigdata.table,我希望每行应用一个函数。它适用于data.frame和apply,但我想用data.table获得一个解决方案 >sdata Z_2016_11 Z_2016_10 Z_2016_09 Z_2016_08 Z_2016_07 1: 21 32 15 NA NA 2: 6
>sdata
Z_2016_11 Z_2016_10 Z_2016_09 Z_2016_08 Z_2016_07
1: 21 32 15 NA NA
2: 6 17 NA NA NA
3: 2 7 9 230 NA
4: 5 19 28 30 0
5: 16 29 30 105 0
6: 2 0 0 0 NA
我想按如下顺序订购
>sdata
Z_1 Z_2 Z_3 Z_4 Z_5
1: 15 32 21 NA NA
2: 17 6 NA NA NA
3: 230 9 7 2 NA
4: 0 30 28 19 5
5: 0 105 30 29 16
6: 0 0 0 2 NA
我可以使用data.frame
t(apply(sdata[, grep("Z", names(sdata), value = TRUE),with=FALSE],1,
function(tmp) c(rev(tmp[!is.na(tmp)]),
rep(NA, times = length(tmp) - length(tmp[!is.na(tmp)])))))
我试过下面的方法
trimt <- function(tmp){
c(rev(tmp[!is.na(tmp)]), rep(NA, times = length(tmp) - length(tmp[!is.na(tmp)])))
}
sdata[,trimt(get(grep("Z", names(sdata), value = TRUE))),by=1:nrow(sdata)]
trimt我们可以使用data.table
方法
setnames(sdata[, {un1 <- unlist(.SD)
as.list(`length<-`(rev(un1[!is.na(un1)]), length(un1)))
} , by = .(grp=1:nrow(sdata))][, grp := NULL], paste0("Z", 1:5))[]
# Z1 Z2 Z3 Z4 Z5
#1: 15 32 21 NA NA
#2: 17 6 NA NA NA
#3: 230 9 7 2 NA
#4: 0 30 28 19 5
#5: 0 105 30 29 16
#6: 0 0 0 2 NA
setnames(sdata[,{un1我们可以使用data.table
方法
setnames(sdata[, {un1 <- unlist(.SD)
as.list(`length<-`(rev(un1[!is.na(un1)]), length(un1)))
} , by = .(grp=1:nrow(sdata))][, grp := NULL], paste0("Z", 1:5))[]
# Z1 Z2 Z3 Z4 Z5
#1: 15 32 21 NA NA
#2: 17 6 NA NA NA
#3: 230 9 7 2 NA
#4: 0 30 28 19 5
#5: 0 105 30 29 16
#6: 0 0 0 2 NA
setnames(sdata[,,{un1对于第一行,为什么您有15 32 21,顺序不对'我想删除NAs,然后反转该行的其余部分,为缺少的值添加NAs并替换该行。发布了一个基于数据的解决方案。Table一般来说,最好也描述一下您的函数要做什么,而不是简单地显示它。您的apply
代码是太复杂了,我不清楚它在做什么。对于第一行,为什么有15 32 21,顺序不正确‘我想删除NAs,然后反转该行的其余部分,为缺少的值添加NAs并替换该行。发布了一个基于数据的解决方案。表一般来说,最好也描述一下您的函数的含义做,而不是简单地展示。你的应用
代码非常复杂,我不知道它在做什么。谢谢。它工作得很好!(而且快得多)谢谢。它工作得很好!(而且快得多)