簡體   English   中英

R - 如何根據另一列中值相等的條件為新列選擇值

[英]R - How to choose values for new column based on condition that values are equal in another column

我有一個數據框,下面是“數據”,我試圖根據條件在它的末尾添加一個新列。 如果列數據$ code與我的數據框“linked”的第一列中的值匹配,我希望新列在“鏈接”的第二列中取相應的值。 如果列數據$ code與我的數據框“linked”的第二列中的值匹配,我希望新列在“鏈接”的第一列中取相應的值。 如果列數據$ 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

你可以試試這個:

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>

恕我直言,這將做你想要的:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM