Добавление новых комбинированных значений в существующий фрейм данных в R - PullRequest
0 голосов
/ 26 апреля 2018

Это приблизительное значение исходного кадра данных. В оригинале столбцов намного больше, чем показано здесь.

id  init_cont  family  description  value
1   K          S       impacteach   1
1   K          S       impactover   3
1   K          S       read         2
2   I          S       impacteach   2
2   I          S       impactover   4
2   I          S       read         1
3   K          D       impacteach   3
3   K          D       impactover   5
3   K          D       read         3

Я хочу объединить значения для воздействия и воздействия для получения среднего значения, которое просто называется воздействием. Я бы хотел, чтобы финальный стол выглядел следующим образом:

id  init_cont  family  description  value
1   K          S       impact       2
1   K          S       read         2
2   I          S       impact       3
2   I          S       read         1
3   K          D       impact       4
3   K          D       read         3

Я не смог понять, как создать эту таблицу. Тем не менее, я смог создать фрейм данных, который выглядит следующим образом:

id  description  value
1   impact       2
1   read         2
2   impact       3
2   read         1
3   impact       4
3   read         3

Каков наилучший способ для меня взять эти новые значения и добавить их в исходный кадр данных? Мне также нужно удалить исходные значения (например, impacteach и Impactover) в исходном кадре данных. Я бы предпочел изменить исходный фрейм данных, а не создавать совершенно новый фрейм данных, потому что у исходного фрейма данных много столбцов.

В случае, если это полезно, это сводная информация о коде, который я использовал для создания более короткого кадра данных с воздействием в качестве комбинации воздействия и воздействия:

df %<%
  mutate(newdescription = case_when(description %in% c("impacteach", "impactoverall") ~ "impact", TRUE ~ description)) %<% 
  group_by(id, newdescription) %<%
  summarise(value = mean(as.numeric(value)))

Ответы [ 3 ]

0 голосов
/ 26 апреля 2018

Что если вы сначала изменили столбец description, чтобы его можно было включить в группу:

df %>% 
    mutate(description = substr(description, 1, 6)) %>%
    group_by(id, init_cont, family, description) %>% 
    summarise(value = mean(value))

# A tibble: 6 x 5
# Groups:   id, init_cont, family [?]
#      id init_cont family description value
#   <int> <chr>     <chr>  <chr>       <dbl>
# 1     1 K         S      impact         2.
# 2     1 K         S      read           2.
# 3     2 I         S      impact         3.
# 4     2 I         S      read           1.
# 5     3 K         D      impact         4.
# 6     3 K         D      read           3.
0 голосов
/ 26 апреля 2018

gsub может использоваться для замены description, содержащего imact в качестве удара, а затем group_by из пакета dplyr поможет в суммировании значения.

df %>% group_by(id, init_cont, family, 
        description = gsub("^(impact).*","\\1", description)) %>%
  summarise(value = mean(value))

# # A tibble: 6 x 5
# # Groups: id, init_cont, family [?]
#      id init_cont family description value
#   <int> <chr>     <chr>  <chr>       <dbl>
# 1     1 K         S      impact       2.00
# 2     1 K         S      read         2.00
# 3     2 I         S      impact       3.00
# 4     2 I         S      read         1.00
# 5     3 K         D      impact       4.00
# 6     3 K         D      read         3.00
0 голосов
/ 26 апреля 2018

Вам просто нужно изменить заявление group_by. Попробуйте group_by(id, init_cont, family)

Поскольку ваш идентификатор, похоже, уже сопоставлен с init_cont и семьей, добавление этих значений не изменит ваш результат суммирования. Тогда у вас есть все нужные столбцы без дополнительной работы.

Если у вас есть много столбцов, вы можете попробовать что-то вроде приведенного ниже кода. По сути, сделайте left_join для ваших исходных данных с вашими обобщенными данными, но сделайте это, используя ., чтобы не сохранять новый фрейм данных. Затем, после объединения (по идентификатору и описанию, которое мы изменили на месте) у вас будет два столбца значений, к которым следует добавить .x и .y, отбросить оригинал и затем использовать отличное, чтобы избавиться от дублирующего «воздействия» столбцы.

df %>% 
  mutate(description = case_when(description %in% c("impacteach", "impactoverall") ~ "impact", TRUE ~ description)) %>%
  left_join(. %>%
              group_by(id, description)
              summarise(value = mean(as.numeric(value))
            ,by=c('id','description')) %>%
  select(-value.x) %>%
  distinct()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...