基于匹配一个第四一个第三柱,用另一个在一列中的值替换(Replacing values in one

2019-07-18 01:16发布

我用下面的例子工作:

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  

任何帮助非常赞赏。

亲切的问候,

Answer 1:

在这里,新的一列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


Answer 2:

由于@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


Answer 3:

尝试以下方法:

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
标签: r replace