一种更有效的计算布尔列的方法

时间:2017-03-11 19:02:38

标签: r for-loop

我有一个数据框,其中包含逗号分隔值的因子。我抱歉没有提供可重复的示例,但我的数据最终看起来像这样:

Col_1   Col_2   Col_3

1        0        0
0        0        1
2        0        0
1        2,2      2
3        0        1,2

因为我有这些以逗号分隔的值,所以我还没有能够写出一个快速的括号表示方法,R很棒。所以我不得不编写一个for循环来遍历我的数据帧并将所有非零条目更改为1。

for( i in seq(1:nrow(DF))){
  if(DF$Col_2 ==0){
     DF$NewCol[i] == 0}
   else {
     DF$NewCol[i] == 1}

上述工作,但需要太长时间。有没有办法在R中使用不同的方法加快速度?

2 个答案:

答案 0 :(得分:3)

试试这个:

DF <- read.table(text="Col_1   Col_2   Col_3
1        0        0
0        0        1
2        0        0
1        2,2      2
3        0        1,2", header=TRUE, stringsAsFactors=FALSE)

DF$NewCol <-ifelse(DF$Col_2 ==0,0,1)
> DF
  Col_1 Col_2 Col_3 NewCol
1     1     0     0      0
2     0     0     1      0
3     2     0     0      0
4     1   2,2     2      1
5     3     0   1,2      0

答案 1 :(得分:2)

如何简单地

DF$NewCol <- as.integer(DF$Col_2 != "0")

给出了

  Col_1 Col_2 Col_3 NewCol
1     1     0     0      0
2     0     0     1      0
3     2     0     0      0
4     1   2,2     2      1
5     3     0   1,2      0

并且比使用ifelse()生成二进制结果更有效。

数据:

DF <- structure(list(Col_1 = c(1L, 0L, 2L, 1L, 3L), Col_2 = structure(c(1L, 
1L, 1L, 2L, 1L), .Label = c("0", "2,2"), class = "factor"), Col_3 = structure(c(1L, 
2L, 1L, 4L, 3L), .Label = c("0", "1", "1,2", "2"), class = "factor")), .Names = c("Col_1", 
"Col_2", "Col_3"), row.names = c(NA, -5L), class = "data.frame")