r需要一种将列聚集在一起而不尾随 NA 并反转结果的方法

  • 本文关键字:NA 方法 结果 在一起 聚集 一种
  • 更新时间 :
  • 英文 :


我正在寻找一种方法,从现有数据框创建一个由一组列(在本例中为 bin 1-9)组成的新列,而不会尾随 NA 并且结果相反。所有这些都不使用循环。感谢您的帮助!

数据集示例:

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 组合字段,但这会在 NA 中聚集:

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.omit

apply(
    X=df[, grepl('^bin_\d+$', names(df))], 
    MARGIN=1, 
    FUN=function(x) {paste(rev(sub('^NA$', '', x)), collapse='')}
)

问题是您对列名进行了硬编码。更简单的方法是使用 apply 遍历行,并在每行上使用 pastecollapse,并结合 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 = ''))

相关内容

最新更新