我正在寻找一种方法来创建一个由现有数据框中的设置列(本例中为bin 1-9)组成的新列,而不会追踪NAs并且结果相反。所有这些都没有使用循环。谢谢你的帮助!
数据集示例:
id bin_1 bin_2 bin_3 bin_4 bin_5 bin_6 bin_7 bin_8 bin_9
1 a b c d e na na na na
2 a b na na na na na na na
理想的结果:
id reversed_noNAs
1 edcba
2 ba
我通常使用do.call/paste组合字段,但这些字段在NAs:
do.call(paste, c(df[c("bin_1", "bin_2", "bin_3", "bin_4", "bin_5", "bin_6","bin_7","bin_8","bin_9")], sep = ""))
谢谢!
答案 0 :(得分:1)
假设您的缺失值已编码NA
而不是字符串" NA",您可以执行以下操作:
apply(
X=df[, grepl('^bin_\\d+$', names(df))],
MARGIN=1,
FUN=function(x) {paste(rev(na.omit(x)), collapse='')}
)
如果您的缺失值被编码为字符串,则可以使用sub
代替na.omit
:
apply(
X=df[, grepl('^bin_\\d+$', names(df))],
MARGIN=1,
FUN=function(x) {paste(rev(sub('^NA$', '', x)), collapse='')}
)
答案 1 :(得分:1)
问题是您对列名进行了硬编码。一种更简单的方法是使用apply
循环遍历行,并在每行上使用paste
加collapse
,并与rev
结合使用。删除NA
可以使用na.omit
:
df = data.frame(matrix(sample(letters[1:5], 100, replace = TRUE), 10, 10))
na_rows = sample(1:10, 5)
na_cols = sample(1:10, 5)
df[sort(na_rows), sort(na_cols)] <- NA
apply(df, 1, function(x) paste(na.omit(rev(x)), collapse = ''))