我有以下示例数据框:
> a = data.frame(a=c(1, 2, 3), b=c(10, 11, 12), c=c(1, 1, 0))
> a
a b c
1 1 10 1
2 2 11 1
3 3 12 0
我想对a$c == 1
,a$a = a$b
的所有行执行操作,否则a$a
保留其值。最终的数据框架a应如下所示:
> a
a b c
1 10 10 1
2 11 11 1
3 3 12 0
最快的方法是什么?当然,在我的问题中,我有数十万行,因此循环遍历整个数据框并逐一进行操作非常慢。
谢谢!
答案 0 :(得分:3)
轻松1-2-3:
df = data.frame(a=c(1, 2, 3), b=c(10, 11, 12), c=c(1, 1, 0))
df$a[df$c == 1] <- df$b[df$c == 1]
df
## a b c
## 1 10 10 1
## 2 11 11 1
## 3 3 12 0
它的内容如下:将a
对应c==1
的所有元素替换为b
中与c==1
对应的所有元素。
基准:
df <- data.frame(a=runif(100000), b=runif(100000), c=sample(c(1,0), 100000, replace=TRUE))
library(microbenchmark)
microbenchmark(df$a[df$c == 1] <- df$b[df$c == 1], df$a <- with(df, ifelse(c == 1, b, a)))
## Unit: milliseconds
## expr min lq median uq max neval
## df$a[df$c == 1] <- df$b[df$c == 1] 13.85375 15.13073 16.61701 74.5387 88.47949 100
## df$a <- with(df, ifelse(c == 1, b, a)) 44.23750 78.85029 103.01894 105.1750 118.09492 100
答案 1 :(得分:3)
a$a <- with(a, ifelse(c == 1, b, a))