根据其他列中的值添加新列到矩阵

时间:2015-09-26 21:49:21

标签: r matrix dataframe

我有这个数据集

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的初学者。

1 个答案:

答案 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()来自评论。正如您所看到的,在这种情况下,简单/直接方法最快,但只有几个百分点。

为什么你觉得这太慢了?