У меня есть следующие данные:

  Group Hormone Damage    Score Greater   
 1 B     control damaged       4       1        
 2 B     control undamaged     4       1        
 3 B     JA      damaged       2       0       
 4 B     JA      undamaged     3       0  
 5 D     control damaged       2       0        
 6 D     control undamaged     1       0        
 7 D     JA      damaged       4       1        
 8 D     JA      undamaged     3       1        

Я создал колонку «Большой» вручную. По сути, он спрашивает: «В какой группе значение поврежденного балла больше?» Чем больше значение присваивается 1, тем меньше 0.

Как мне создать код, чтобы сделать это для меня? Я попытался с помощью следующего кода dplyr, но безуспешно:

df%>% group_by(Group) %>% 
  mutate(Greater1 = if_else(Score>Score, 0,1))

Если этот вопрос уже задавался, пожалуйста, дайте мне знать, потому что я не могу найти похожий.

1
Grubbmeister 20 Авг 2018 в 11:28

3 ответа

Лучший ответ

Если у вас нет проблем со связями, вы можете просто сделать

library(tidyverse)

df %>% 
 group_by(Group, Damage) %>% 
 mutate(new = as.integer(Score == max(Score)))

Который дает

# A tibble: 8 x 6
# Groups:   Group, Damage [4]
  Group Hormone Damage    Score Greater   new
  <chr> <chr>   <chr>     <int>   <int> <int>
1 B     control damaged       4       1     1
2 B     control undamaged     4       1     1
3 B     JA      damaged       2       0     0
4 B     JA      undamaged     3       0     0
5 D     control damaged       2       0     0
6 D     control undamaged     1       0     0
7 D     JA      damaged       4       1     1
8 D     JA      undamaged     3       1     1
6
Sotos 20 Авг 2018 в 08:38

Базовая опция R с использованием ave

df$Greater <- with(df, as.numeric(Score == ave(Score, Group, Damage, FUN = max)))

df
#  Group Hormone    Damage Score Greater
#1     B control   damaged     4       1
#2     B control undamaged     4       1
#3     B      JA   damaged     2       0
#4     B      JA undamaged     3       0
#5     D control   damaged     2       0
#6     D control undamaged     1       0
#7     D      JA   damaged     4       1
#8     D      JA undamaged     3       1

Который также можно записать как

df$Greater <- with(df, ave(Score, Group, Damage, FUN = function(x) x == max(x)))

Или продолжить подход if_else, который вы пытались

library(dplyr)
df%>% 
  group_by(Group, Damage) %>% 
  mutate(Greater1 = if_else(Score==max(Score), 1,0))
3
Ronak Shah 20 Авг 2018 в 08:58

Использование data.table

library(data.table)
setDT(df)[, new := as.integer(Score == max(Score)), .(Group, Damage)]
0
akrun 20 Авг 2018 в 13:00
51926789