根据与第4列匹配的第3列,将一列中的值替换为另一列

时间:2013-01-09 10:16:14

标签: r replace

我正在使用以下示例:

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

如果NewModified中的任何值匹配,我想用New_Orig中的值替换Original中的值。

理想情况下,New将如下所示:

New
2  
2
8
10
10
10
10
10
18
20  

任何帮助都非常感激。

亲切的问候,

3 个答案:

答案 0 :(得分:5)

此处创建了一个新列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

答案 1 :(得分: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

答案 2 :(得分:1)

尝试以下方法:

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"]