我正在探索编辑下面向量的最简单方法。我想用 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)