R - 如何根据另一列中的值相等的条件为新列选择值
R - How to choose values for new column based on condition that values are equal in another column
我有一个数据框,下面是 "data",我正在尝试根据条件在它的末尾添加一个新列。如果列 data$code 与我的数据框 "linked" 第一列中的值匹配,我希望新列采用 "linked" 第二列中的相应值。如果列 data$code 与我的数据框 "linked" 第二列中的值匹配,我希望新列采用 "linked" 第一列中的相应值。如果列 data$code 与任一列中的任何值都不匹配,我想 return 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))
没有错误消息 returned,但是,我在新列中没有得到正确的对应值,它们由于某种原因混淆了。我做错了什么?
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
恕我直言,这会做你想做的事:
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
你可以试试这个:
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>
我有一个数据框,下面是 "data",我正在尝试根据条件在它的末尾添加一个新列。如果列 data$code 与我的数据框 "linked" 第一列中的值匹配,我希望新列采用 "linked" 第二列中的相应值。如果列 data$code 与我的数据框 "linked" 第二列中的值匹配,我希望新列采用 "linked" 第一列中的相应值。如果列 data$code 与任一列中的任何值都不匹配,我想 return 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))
没有错误消息 returned,但是,我在新列中没有得到正确的对应值,它们由于某种原因混淆了。我做错了什么?
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
恕我直言,这会做你想做的事:
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
你可以试试这个:
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>