我用下面的例子工作:
Original Modified New_Orig New
1 2 1 0
2 4 1 0
3 6 4 0
4 8 5 0
5 10 5 0
6 12 5 0
7 14 5 0
8 16 5 0
9 18 9 0
10 20 10 0
我想替换值New
从值Modified
如果New_Orig
与任何值匹配Original
。
理想的情况是New
会是这样的:
New
2
2
8
10
10
10
10
10
18
20
任何帮助非常赞赏。
亲切的问候,
在这里,新的一列New
创建:
within(dat, New <- Modified*(New_Orig == Original))
Original Modified New_Orig New
1 1 2 1 2
2 2 4 1 0
3 3 6 4 0
4 4 8 5 0
5 5 10 5 10
6 6 12 5 0
7 7 14 5 0
8 8 16 5 0
9 9 18 9 18
10 10 20 10 20
更新
匹配值,然后从相应的值Modified
:
within(dat, New <- Modified[match(New_Orig, Original)])
Original Modified New_Orig New
1 1 2 1 2
2 2 4 1 2
3 3 6 4 8
4 4 8 5 10
5 5 10 5 10
6 6 12 5 10
7 7 14 5 10
8 8 16 5 10
9 9 18 9 18
10 10 20 10 20
由于@rcs了完全相同的答案,我会给,我以为我会告诉你一个替代方法来创建这个“新”一栏,而不是对其进行初始化为全零。
data <- data.frame(Original = 1:10,
Modified = seq(2, 20, 2),
New_Orig = c(1, 1, 4, 5, 5,
5, 5, 5, 9, 10))
within(data, {
New <- ifelse(Original == New_Orig, Modified, 0)
})
# Original Modified New_Orig New
# 1 1 2 1 2
# 2 2 4 1 0
# 3 3 6 4 0
# 4 4 8 5 0
# 5 5 10 5 10
# 6 6 12 5 0
# 7 7 14 5 0
# 8 8 16 5 0
# 9 9 18 9 18
# 10 10 20 10 20
尝试以下方法:
v <- dat$New_Orig==dat$Original # this gives a logical vector,
# you could also use which(dat$New_Orig==dat$Original)
# to obtain the indices
dat[v, "New"] <- dat[v, "Modified"]
文章来源: Replacing values in one column with another based on a 3rd column matching a 4th