R 需要一种将列聚集在一起而不跟踪NAs并反转结果的方法吗

R 需要一种将列聚集在一起而不跟踪NAs并反转结果的方法吗,r,R,我正在寻找一种方法,从现有数据帧中创建一个由一组列(本例中为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

我正在寻找一种方法,从现有数据帧中创建一个由一组列(本例中为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 = ""))

谢谢

假设缺少的值是编码的
NA
而不是字符串“NA”,则可以执行以下操作:

apply(
    X=df[, grepl('^bin_\\d+$', names(df))], 
    MARGIN=1, 
    FUN=function(x) {paste(rev(na.omit(x)), collapse='')}
)
如果缺少的值被编码为字符串,则可以使用
sub
而不是
na。省略

apply(
    X=df[, grepl('^bin_\\d+$', names(df))], 
    MARGIN=1, 
    FUN=function(x) {paste(rev(sub('^NA$', '', x)), collapse='')}
)
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 = ''))

问题是您硬编码列名。一种更简单的方法是使用
apply
在行上循环,并在每行上使用
paste
plus
collapse
,再加上
rev
。可以使用
NA删除
NA
。省略

apply(
    X=df[, grepl('^bin_\\d+$', names(df))], 
    MARGIN=1, 
    FUN=function(x) {paste(rev(sub('^NA$', '', x)), collapse='')}
)
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 = ''))
df=data.frame(矩阵(示例(字母[1:5],100,replace=TRUE),10,10))
na_行=样本(1:10,5)
na_cols=样品(1:10,5)
df[排序(不适用行),排序(不适用列)]