【问题标题】:Combine two vectors into one in R在R中将两个向量合并为一个
【发布时间】:2019-08-13 16:59:28
【问题描述】:

我想通过以下逻辑将两个字符向量合并为一个:

A <- c("005", "NA", "100", "NA")
B <- c("005", "NA", "NA", "257")

C <- c("005", "NA", "100", "257") 

假设我有向量 AB,我想以这样的方式合并它们,得到向量 C,我该如何实现?

【问题讨论】:

  • 比较的逻辑是什么?为什么这些数字存储为字符串?如果AB 中有两个不同的数字,你的输出是什么?
  • 这些数字是来自两个不同数据框的 ID,分别代表特定品牌。但是,有一些缺失值(给定品牌没有 ID)。但是,我想保留它们。我有两个列表(A 和 B),我想保持列表 A 不变,但如果有的话,用 B 的给定值填充 A 的 NA - 在本例中为“257”。
  • 请注意"NA"NA 不是一回事。
  • 在这种情况下,我说的是 NA -> 很抱歉造成混乱!

标签: r vector merge character missing-data


【解决方案1】:
replace(A, A == "NA", B[A == "NA"])
#[1] "005" "NA"  "100" "257"

temp = cbind(A, B)
temp[cbind(seq_along(A),
           match(colnames(temp)[max.col(temp != "NA")], colnames(temp)))]
#[1] "005" "NA"  "100" "257"

如果您有 NA 而不是 "NA",则更改

  1. A == "NA"is.na(A)
  2. temp != "NA"!is.na(temp)

【讨论】:

    【解决方案2】:

    我们可以使用dplyr 包中的coalesce,但请注意,您需要将“NA”替换为NA,因为在R 中它们是不同的。在这里,我将AB 都转换为数字来实现这一点。

    library(dplyr)
    
    A <- c("005", "NA", "100", "NA")
    B <- c("005", "NA", "NA", "257")
    
    A <- as.numeric(A)
    B <- as.numeric(B)
    
    coalesce(A, B)
    # [1]   5  NA 100 257
    

    【讨论】:

    • 我想as.numeric 可以替换为foo = function(x) replace(x, x == "NA", NA)
    • @d.b 我同意你的看法。使用as.numeric 的危险是如果有其他字符,例如“下面”或“上面”,它们也会变成NA,这可能不是OP想要的。但我决定将as.numeric 保留在这里,作为展示此函数行为并比较其他答案的机会。感谢您的 cmets。
    【解决方案3】:

    你可以的

    C <- A
    C[A == "NA"] <- B[A == "NA"]
    C
    #[1] "005" "NA"  "100" "257"
    

    【讨论】:

      猜你喜欢
      • 2015-12-30
      • 1970-01-01
      • 1970-01-01
      • 2022-06-17
      • 1970-01-01
      • 2021-10-19
      • 1970-01-01
      • 2011-07-05
      • 1970-01-01
      相关资源
      最近更新 更多