R最佳条件编辑

时间:2017-11-08 00:00:14

标签: r dataframe replace conditional

我正在探索编辑下面矢量的最简单方法。我想用测试值<来替换A和B中的值。 2(0或1)用NA,然后消除测试列。我知道我们可以在没有条件的情况下替换它们,但这个例子是为了从更大的数据框中说明问题。

> df <- data.frame(list(A=c(100, 30, 200, 80, 5), B=c(12, 40, 100,70,50), testA=c(17, 1, 120,400,70), testB=c(5, 4, 1, 10, 0)))

看起来像这样:

 A    B testA testB
100   12   17    5
 30   40    1    4
200  100  120    1
 80   70  400   10
  5   50   70    0

它应该是这样的:

 A    B
100   12
 NA   40
200   NA
 80   70
  5   NA

提前谢谢!

2 个答案:

答案 0 :(得分:0)

像@Jens Leerssen指出的那样,有很多方法。我能看到的最简单的方法是为每列提供条件。如果你想缩放它,请使用* apply或for loop:

with(df, ifelse(testA < 2, NA, A))

不确定你处理了多少数据,但这可以在我的盒子上运行(osx,16gb,i5):

df <- data.frame(list(A=c(100, 30, 200, 80, 5), B=c(12, 40, 100,70,50), testA=c(17, 1, 120,400,70), testB=c(5, 4, 1, 10, 0)))

# create two vectors, one for each set of columns
vec_nam = names(df)
vec_split = tolower(grepl('^test.*', vec_nam)) # tolower() to avoid conflict with TRUE/FALSE
list_df = split(vec_nam, vec_split)

num_comparisons = length(list_df$false)
list_return = vector('list', length = num_comparisons)

for (i in 1:num_comparisons){
  col_test = list_df$true[i]
  col_valu = list_df$false[i]

  list_return[[i]] = ifelse(df[, col_test] < 2, NA, df[, col_valu])
}

final_df = setNames(do.call(cbind.data.frame, list_return), list_df$false)

答案 1 :(得分:0)

> df2 <- data.frame(A= with(df, ifelse(df$testA < 2, NA, df$A)), B= with(df, ifelse(df$testB < 2, NA, df$B)))

它适用于给定的示例,但它也不可能进行scalate。我认为它很有效率。