R:根据指定值计算行中的差异

R:根据指定值计算行中的差异,r,R,我有一个数据框,看起来像这样: Game Team Value 1 A 0.6 1 B 0.5 2 C 1.2 2 D 0.3 我想创建一个新列,用于计算给定游戏的“值”差异,因此它将是: difference 0.1 -0.1 0.9 -0.9 换句话说,我想按“游戏”分组,但我不太确定如何做到这一点,前提是每组只有两个元素: library(data.table) # using @DavidArenburg clean

我有一个数据框,看起来像这样:

Game Team Value
1      A    0.6
1      B    0.5
2      C    1.2
2      D    0.3
我想创建一个新列,用于计算给定游戏的“值”差异,因此它将是:

difference
0.1
-0.1
0.9
-0.9

换句话说,我想按“游戏”分组,但我不太确定如何做到这一点,前提是每组只有两个元素:

library(data.table)

# using @DavidArenburg clean trick
# otherwise c(diff(rev(Value)),diff(Value)) makes it

setDT(df)[,difference:=diff(Value)*c(-1,1), by = Game][]  
   Game Team Value difference
1:    1    A   0.6        0.1
2:    1    B   0.5       -0.1
3:    2    C   1.2        0.9
4:    2    D   0.3       -0.9

假设每个组只有两个元素:

library(data.table)

# using @DavidArenburg clean trick
# otherwise c(diff(rev(Value)),diff(Value)) makes it

setDT(df)[,difference:=diff(Value)*c(-1,1), by = Game][]  
   Game Team Value difference
1:    1    A   0.6        0.1
2:    1    B   0.5       -0.1
3:    2    C   1.2        0.9
4:    2    D   0.3       -0.9

您还可以使用
aggregate

c(t(aggregate(Value~Game, df, function(x) c(diff(rev(x)), diff(x)))[, -1]))
[1]  0.1 -0.1  0.9 -0.9

您还可以使用
aggregate

c(t(aggregate(Value~Game, df, function(x) c(diff(rev(x)), diff(x)))[, -1]))
[1]  0.1 -0.1  0.9 -0.9

使用
ave
的简单base R解决方案可以是

with(df, ave(Value, Game, FUN = diff)) * c(-1, 1)
# [1]  0.1 -0.1  0.9 -0.9

使用
ave
的简单base R解决方案可以是

with(df, ave(Value, Game, FUN = diff)) * c(-1, 1)
# [1]  0.1 -0.1  0.9 -0.9

使用
dplyr

library(dplyr)
df1 %>% 
    group_by(Game) %>%
    mutate(difference = diff(Value)*c(-1,1))
#   Game  Team Value difference
#  (int) (chr) (dbl)      (dbl)
#1     1     A   0.6        0.1
#2     1     B   0.5       -0.1
#3     2     C   1.2        0.9
#4     2     D   0.3       -0.9

使用
dplyr

library(dplyr)
df1 %>% 
    group_by(Game) %>%
    mutate(difference = diff(Value)*c(-1,1))
#   Game  Team Value difference
#  (int) (chr) (dbl)      (dbl)
#1     1     A   0.6        0.1
#2     1     B   0.5       -0.1
#3     2     C   1.2        0.9
#4     2     D   0.3       -0.9

@csgillespie这怎么是一个重复的链接问题?@Davidernburg确切的问题不是重复的,但一般原则是重复的。本质上,问题是“我想把一个函数应用于一个变量上的数据”。过去有很多问题都涉及到了这一点(包括时间安排)。@csgillespie这是一个如何重复的链接问题?@DavidArenburg确切的问题不是重复的,但一般原则是重复的。本质上,问题是“我想把一个函数应用于一个变量上的数据”。过去有很多问题都涉及到这一点(包括时间安排)。