快速操作R中的数据框

时间:2014-05-20 18:11:34

标签: r dataframe

我有以下示例数据框:

> 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 == 1a$a = a$b的所有行执行操作,否则a$a保留其值。最终的数据框架a应如下所示:

> a
  a  b c
1 10 10 1
2 11 11 1
3  3 12 0 

最快的方法是什么?当然,在我的问题中,我有数十万行,因此循环遍历整个数据框并逐一进行操作非常慢。

谢谢!

2 个答案:

答案 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))