我有这个数据集
data
[C1] [C2] [C3] [C4] [C5] [C6] [C7] [C8]
[1,] 5 1 2 1 4 2 1 NA
[2,] 4 1 3 4 1 1 NA 2
[3,] 3 4 6 7 1 1 2 2
[4,] 1 3 NA 1 NA 2 NA NA
[5,] 1 NA 5 NA NA 4 1 2
[6,] 1 4 NA NA NA 4 1 2
[7,] 1 4 NA NA NA 4 1 2
我想添加新的列C9,如果相应的行在C2,C3或C4列中的值为1,则可以采用两个值1(True),否则为0(False)。 我试过这段代码
C9<-data[,2:4]==1
#change the logical matrix into numeric
C9<-C9*1
#convert the matrix into vector #
C9<-rowSums(C9)
data=cbind(data,C9)
代码运行良好但耗费更多时间所以我的问题是有一种独特的方式来做到这一点,因为我是R的初学者。
答案 0 :(得分:1)
如果我正确理解了这个问题,如果C2,C3或C4中的一个完全 1,0则C9必须为1,否则为0。所以解决方案必须处理NA
s。
这比较了三种方法:
f.1 <- function() (rowSums(data[,2:4]==1, na.rm=TRUE)>0)*1L
f.2 <- function() {x<-rep(0L,nrow(data)); x[(data[,2]==1 | data[,3]==1 | data[,4]==1)]<-1L; x}
f.3 <- function() apply(data[,2:4], 1, function(x) any(x==1, na.rm=T))*1L
library(microbenchmark)
microbenchmark(f.1(),f.2(),f.3(), times=1000)
# Unit: microseconds
# expr min lq mean median uq max neval cld
# f.1() 11.845 15.991 20.76593 18.952 22.5050 293.751 1000 a
# f.2() 10.660 14.806 44.43363 17.768 20.7290 25063.000 1000 a
# f.3() 81.137 91.797 121.80148 103.050 125.8515 2719.566 1000 b
identical(f.1(),f.2())
# [1] TRUE
identical(f.1(),f.3())
# [1] TRUE
f.1()
是您的方法(或多或少),f.2()
是一种非常简单直接的方法,f.3()
来自评论。正如您所看到的,在这种情况下,简单/直接方法最快,但只有几个百分点。
为什么你觉得这太慢了?