R 最佳条件编辑



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

> 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

提前谢谢你!

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

它适用于给定的示例,但也无法缩放。我认为这是有效的。

就像@Jens Leerssen指出的那样,有很多方法。 我能看到的最简单方法是为每列设置一个条件。 如果要缩放它,请使用 *apply 或 for 循环:

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)

最新更新