2

我有一个包含类别和值的数据框。根据类别,我想减去存储在另一个表中的值。

myframe <- data.frame(
         x = factor(c("A", "D", "A", "C")), 
         y = c(8, 3, 9, 9))

reference <- c('A'= 1, 'B'= 2, 'C'= 3, 'D'= 4)  

期望的(y-ref)结果将是:

result <- data.frame(
         x = factor(c("A", "D", "A", "C")), 
         y = c(8, 3, 9, 9),
         r = c(7, -1, 8, 6))

      x y  r
    1 A 8  7        
    2 D 3 -1
    3 A 9  8
    4 C 9  6

在这种情况下,参考“表”是一个命名向量,但可以将其更改为更适合的数据格式。

我不知道如何做到这一点......

4

2 回答 2

2

这是一个相当直接的任务,使用matchand [...

myframe$r <- myframe$y - reference[ match( myframe$x , names( reference ) ) ]
#  x y  r
#1 A 8  7
#2 D 3 -1
#3 A 9  8
#4 C 9  6

很确定这是一个(多次)重复,因此我们应该为您找到一个好的指针并关闭问题(但我赞扬您显示输入数据和期望的结果,许多问题通常没有那么好布置)。

编辑

那么网站上有很多很多 match基于问题的问题。很难选择一个指向完全相同的副本。但我建议通过搜索“ match”来浏览其中的一些(您可以通过将搜索词括在这样的方括号中来按特定标签进行搜索"[r]")。

于 2013-10-28T18:19:23.147 回答
1

data.table方式:

library(data.table)

# convert to data.table and set key for the upcoming merge
dt = data.table(myframe, key = 'x')
ref = data.table(x = names(reference), val = reference)

# merge and add a new column
dt[ref, r := y - val]
dt
#   x y  r
#1: A 8  7
#2: A 9  8
#3: C 9  6
#4: D 3 -1
于 2013-10-28T18:22:14.330 回答