R 在给定逻辑条件的情况下,沿同一列执行操作

R 在给定逻辑条件的情况下,沿同一列执行操作,r,R,我有一个这种形式的数据框架 distance city obs 9 0 1 5 1 2 7 0 3 6 0 4 5 0 5 10 1 6 11 0 7 15 0 8 我想创建一个新的列差,计算每个观测值之间的列距离中的值与最近的列距离中的值之间的差 换句话说,我想要这样的东西 distance city obs difference

我有一个这种形式的数据框架

distance city obs
9        0    1
5        1    2
7        0    3
6        0    4
5        0    5
10       1    6
11       0    7
15       0    8
我想创建一个新的列差,计算每个观测值之间的列距离中的值与最近的列距离中的值之间的差

换句话说,我想要这样的东西

    distance city obs difference
    9        0    1   1
    5        1    2   0
    7        0    3   2
    6        0    4   1
    5        0    5   0
    10       1    6   0
    11       0    7   1
    15       0    8   5
其中,新列中的第一个obs具有1,因为这是距离9和10之间的差值,在这种情况下,这是与观测值1及其最近城市obs 6相关联的列距离中的值。同样的道理也适用于其他OB。例如,obs 3的差值为2,因为这表示obs 3本身与其最近城市之间的列距离中的值之间的差值,在本例中为观测值2。城市本身呈现0

有人能帮我吗


非常感谢。

这里有一个dplyr解决方案,您可以找到到任何城市的最小距离:

library(dplyr)
df %>% rowwise %>% mutate(difference = min(abs(df$distance[df$city == 1] - distance)))
#Source: local data frame [8 x 4]
#Groups: <by row>
#
# A tibble: 8 x 4
#  distance  city   obs difference
#     <int> <int> <int>      <int>
#1        9     0     1          1
#2        5     1     2          0
#3        7     0     3          2
#4        6     0     4          1
#5        5     0     5          0
#6       10     1     6          0
#7       11     0     7          1
#8       15     0     8          5
下面是base-r方法:

df$difference <- sapply(df$distance,function(x)  min(abs(df$distance[df$city == 1] - x)))
df
#  distance city obs difference
#1        9    0   1          1
#2        5    1   2          0
#3        7    0   3          2
#4        6    0   4          1
#5        5    0   5          0
#6       10    1   6          0
#7       11    0   7          1
#8       15    0   8          5

这里有一个dplyr解决方案,您可以找到到任何城市的最小距离:

library(dplyr)
df %>% rowwise %>% mutate(difference = min(abs(df$distance[df$city == 1] - distance)))
#Source: local data frame [8 x 4]
#Groups: <by row>
#
# A tibble: 8 x 4
#  distance  city   obs difference
#     <int> <int> <int>      <int>
#1        9     0     1          1
#2        5     1     2          0
#3        7     0     3          2
#4        6     0     4          1
#5        5     0     5          0
#6       10     1     6          0
#7       11     0     7          1
#8       15     0     8          5
下面是base-r方法:

df$difference <- sapply(df$distance,function(x)  min(abs(df$distance[df$city == 1] - x)))
df
#  distance city obs difference
#1        9    0   1          1
#2        5    1   2          0
#3        7    0   3          2
#4        6    0   4          1
#5        5    0   5          0
#6       10    1   6          0
#7       11    0   7          1
#8       15    0   8          5

这与@jasbner的相同,只是使用了滚动联接,我怀疑在某些情况下,滚动联接可能更有效:

library(data.table)
setDT(DF)

DF[, v := DF[city == 1][.SD, on=.(distance), roll="nearest", abs(x.distance-i.distance)]]

   distance city obs v
1:        9    0   1 1
2:        5    1   2 0
3:        7    0   3 2
4:        6    0   4 1
5:        5    0   5 0
6:       10    1   6 0
7:       11    0   7 1
8:       15    0   8 5

这与@jasbner的相同,只是使用了滚动联接,我怀疑在某些情况下,滚动联接可能更有效:

library(data.table)
setDT(DF)

DF[, v := DF[city == 1][.SD, on=.(distance), roll="nearest", abs(x.distance-i.distance)]]

   distance city obs v
1:        9    0   1 1
2:        5    1   2 0
3:        7    0   3 2
4:        6    0   4 1
5:        5    0   5 0
6:       10    1   6 0
7:       11    0   7 1
8:       15    0   8 5

非常感谢你,贾斯布纳。非常感谢。非常感谢你,贾斯布纳。非常感谢。我认为他们没有,这是目前的状态@jasbner:我认为他们没有,这是目前的状态@jasbner: