我正在探索编辑下面矢量的最简单方法。我想用测试值<来替换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
提前谢谢!
答案 0 :(得分:0)
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。我认为它很有效率。