создать новый столбец, используя различия строк - PullRequest
0 голосов
/ 12 марта 2020

У меня есть набор данных, как показано ниже.

enter image description here

Как создать новый столбец B, используя разницу значений в A с совпадающим идентификатором. Извиняюсь, если об этом уже спрашивали. Спасибо

enter image description here

Ответы [ 3 ]

4 голосов
/ 12 марта 2020

Используя dplyr, мы можем group_by ID и вычесть first и last значения A.

library(dplyr)

df %>%
 group_by(ID) %>%
 summarise(B = first(A) - last(A), A = first(A)) %>%
 select(names(df), B)

# A tibble: 4 x 3
#  ID        A     B
#  <fct> <dbl> <dbl>
#1 aa        2    -1
#2 bb        4     0
#3 cc        3     1
#4 dd        1     0

данные

df <- structure(list(ID = structure(c(1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L
), .Label = c("aa", "bb", "cc", "dd"), class = "factor"), A = c(2, 
4, 3, 1, 3, 4, 2, 1)), class = "data.frame", row.names = c(NA, -8L))
0 голосов
/ 12 марта 2020

Мы можем использовать data.table методы

library(data.table)
setDT(df)[, .(B = first(A) - last(A), A = first(A)), .(ID)]
данные
df <- structure(list(ID = structure(c(1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L
), .Label = c("aa", "bb", "cc", "dd"), class = "factor"), A = c(2, 
4, 3, 1, 3, 4, 2, 1)), class = "data.frame", row.names = c(NA, -8L))
0 голосов
/ 12 марта 2020

Другой подход может заключаться в повороте таблицы так, чтобы два значения «А» находились в отдельных столбцах.

library(tidyverse)

df %>% 
  mutate(name = if_else(duplicated(ID), "A_additional", "A")) %>% 
  pivot_wider(id_cols = ID, values_from = A, names_from = name) %>% 
  mutate(B = A - A_additional)

# # A tibble: 4 x 4
#   ID        A A_additional     B
#   <fct> <dbl>        <dbl> <dbl>
# 1 aa        2            3    -1
# 2 bb        4            4     0
# 3 cc        3            2     1
# 4 dd        1            1     0

Это решение не требует группировки, поэтому должно хорошо масштабироваться для больших наборов данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...