Как добавить столбец со значением, основанным на значении поля в строке? - PullRequest
2 голосов
/ 18 апреля 2020

допустим, у меня есть такой тип данных:

df <- tribble(
  ~ID,~Reply_to_ID, ~author,
  14,  NA,      "John",
  16,  14,      "Jack",
  18,  14,      "John",
  20,  22,      "Annie",
  22,  24,      "Peter",
  24,  16,      "Annie"
)

Каждый идентификатор уникален для сообщения. Каждое сообщение может быть ответом на другое сообщение.

. дополнительный столбец с именем автора сообщения, на которое ответили. Например, Джек отвечает на сообщение 14, которое было написано "John", затем Джон также отвечает на его сообщение, поэтому у меня будет что-то вроде

  ~ID,~Reply_to_ID, ~author, ~Replied_to_author,
  14,  NA,      "John", NA,
  16,  14,      "Jack", "John",
  18,  14,      "John", "John",
  20,  22,      "Annie", "Peter",
  22,  24,      "Peter", "Annie",
  24,  16,      "Annie", "Jack"
)

Возможно, я бы хотел используйте tidyverse для решения этой проблемы.

То, что я до сих пор пробовал, было чем-то вроде

newDF <- mutate(
  df,
  Reply_to_author = filter(df, .data$id == .data$reply_to_message_id)
)

и тому подобным. Я знаю, что могу получить значение, используя что-то вроде filter(df, id == 14)$author, но я не могу использовать mutate для создания нового столбца для этого значения.

Надеюсь, я был достаточно ясно.

Ответы [ 2 ]

2 голосов
/ 18 апреля 2020

Мы можем match``Reply_to_ID до ID, чтобы получить соответствующий author.

В базе R мы можем сделать это, используя transform

transform(df, Replied_to_author = author[match(Reply_to_ID, ID)])

Чтобы вписать это в tidyverse, мы можем использовать mutate:

library(dplyr)
df %>% mutate(Replied_to_author = author[match(Reply_to_ID, ID)])

#     ID Reply_to_ID author Replied_to_author
#  <dbl>       <dbl> <chr>  <chr>            
#1    14          NA John   NA               
#2    16          14 Jack   John             
#3    18          14 John   John             
#4    20          22 Annie  Peter            
#5    22          24 Peter  Annie            
#6    24          16 Annie  Jack            
0 голосов
/ 18 апреля 2020

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

library(data.table)
setDT(df)[, Replied_to_author := author[match(Reply_to_ID, ID)]][]
...