【问题标题】:R - How to choose values for new column based on condition that values are equal in another columnR - 如何根据另一列中的值相等的条件为新列选择值
【发布时间】:2016-03-08 12:24:55
【问题描述】:

我有一个数据框,下面是“数据”,我正在尝试根据条件在其末尾添加一个新列。如果列 data$code 与我的数据框“linked”的第一列中的值匹配,我希望新列采用“linked”第二列中的相应值。如果列 data$code 与我的数据框“linked”的第二列中的值匹配,我希望新列采用“linked”第一列中的相应值。如果列 data$code 与任一列中的任何值都不匹配,我想返回 NA。我尝试了以下代码:

data$new<- ifelse(data$code %in% linked[,1],linked[linked[,1] == data$code,2],ifelse(data$code == linked[,2],linked[linked[,2] %in% data$code,1],NA))

没有返回错误消息,但是,我在新列中没有得到正确的对应值,它们由于某种原因混淆了。我做错了什么?

head(linked)
    Col1   Col2     
1 123456 654321 
2 234567 123456 
3 999999 543210 
4 102938 546378 
5 887765 000998 
6 564738 222345

    head(data)
      code       x     y        z
1   123456       1     2        0
2   999999       2     3        0
3   000998       3     4        0
4   106813       4     6        0
5   222345       5     6        0
6   106815       6     5        0

我想要的结果是:

head(data)
      code       x     y        z        new
1   123456       1     2        0     654321 
2   999999       2     3        0     543210
3   000998       3     4        0     887765
4   106813       4     6        0         NA
5   222345       5     6        0     564738
6   106815       6     5        0         NA

【问题讨论】:

    标签: r conditional-statements subset


    【解决方案1】:

    恕我直言,这将满足您的要求:

    merge(data, linked, by.x="code", by.y="Col1", all.x=TRUE)
    

    我得到的数据帧是你的头脑:

    linked <- read.table(header=TRUE, colClasses="character", text=
    'Col1   Col2     
    1 123456 654321 
    2 234567 123456 
    3 999999 543210 
    4 102938 546378 
    5 887765 000998 
    6 564738 222345')
    
    data <- read.table(header=TRUE, colClasses="character", text=
    'code       x     y        z
    1   123456       1     2        0
    2   999999       2     3        0
    3   000998       3     4        0
    4   106813       4     6        0
    5   222345       5     6        0
    6   106815       6     5        0')
    
    d1 <- merge(data, linked, by.x="code", by.y="Col1", all.x=TRUE)
    d2 <- merge(d1, linked, by.x="code", by.y="Col2", all.x=TRUE)
    d2$col.new <- with(d2, ifelse(!is.na(Col2), Col2, Col1))
    d2
    

    .

    > d2
        code x y z   Col2   Col1 col.new
    1 000998 3 4 0   <NA> 887765  887765
    2 106813 4 6 0   <NA>   <NA>    <NA>
    3 106815 6 5 0   <NA>   <NA>    <NA>
    4 123456 1 2 0 654321 234567  654321
    5 222345 5 6 0   <NA> 564738  564738
    6 999999 2 3 0 543210   <NA>  543210
    

    【讨论】:

    • 是的,这适用于第一列中的匹配,但如果“code”与“Col2”匹配,我也尝试显示 Col1 中的值
    • 我编辑了我的答案。这两列怎么办?
    • 如果可能的话,我希望它们在同一列中
    • 两列都有值怎么办? d2$col.new &lt;- with(d2, ifelse(!is.na(Col2), Col2, Col1))?
    • 这实际上似乎不起作用;由于某种原因,它正在添加一些不应该发生的行
    【解决方案2】:

    你可以试试这个:

    data$col.new <- linked$Col2[match(data$code,linked$Col1)]
    data$col.new[is.na(data$col.new)] <- linked$Col1[match(data$code[is.na(data$col.new)],linked$Col2)]
    
    data
    #     code x y z col.new
    # 1 123456 1 2 0  654321
    # 2 999999 2 3 0  543210
    # 3 000998 3 4 0  887765
    # 4 106813 4 6 0    <NA>
    # 5 222345 5 6 0  564738
    # 6 106815 6 5 0    <NA>
    

    【讨论】:

      猜你喜欢
      • 2016-02-23
      • 2020-10-24
      • 2022-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-15
      相关资源
      最近更新 更多