Операция в том же столбце при условии логического условия - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть фрейм данных этой формы

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

Я хотел бы создать новый столбец "разность", который вычисляет разницу значений в столбце "расстояние" между каждым наблюдением и его ближайшим (в терминах значений в расстоянии столбца) city.

Другими словами, я хочу иметь что-то вроде этого

    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) соответственно.То же самое относится и к другим акциям.Например, obs 3 представляет разницу 2, поскольку она представляет разницу между значениями в столбце расстояния между самой obs 3 и его ближайшим городом, что в данном случае является наблюдением 2. В самих городах присутствует 0.

Кто-нибудь может мне с этим помочь??

Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Это то же самое, что и у @ 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
0 голосов
/ 14 ноября 2018

Вот решение 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...