简体   繁体   中英

Combine rows into one in R

I have a dataframe which looks like this:

ID  Name                m1  m2  m3  m4  m5  m6  m7  m8
37  Grötlingbo Roes II  0   0   0   0   1   0   0   0   
37  Grötlingbo Roes II  0   1   0   0   0   0   0   0   
37  Grötlingbo Roes II  0   0   1   0   0   0   0   0   
123 Hablingbo Havor III 0   0   0   0   0   0   0   0   
123 Hablingbo Havor III 0   0   0   0   0   0   1   0   
38  Hablingbo Havor I   0   0   1   0   0   0   0   0   
38  Hablingbo Havor I   0   0   0   0   0   0   0   0   
38  Hablingbo Havor I   0   0   0   0   0   0   0   0   
38  Hablingbo Havor I   0   0   0   1   0   0   0   0   
38  Hablingbo Havor I   0   1   0   0   0   1   0   0

I need to combine rows with the same name and their observations in columns m1 to m8 into one row. Only the row names are identical but not the observations. I know that the observations will not collide because I was already tidying the dataframe before. Since I don't want to add new columns, I cannot use pivot_wider . And I believe the unite function is only for uniting columns, not rows. I feel like it could be done with group_by but don't know what I need to add. I was already reading many entries here but did not find an answer to my problem yet. Does anyone have a solution?

Try the summarize(across()) approach:

library(dplyr)
df %>%
  group_by(ID, Name) %>%
  summarize(across(starts_with("M"), sum))

`summarise()` regrouping output by 'ID' (override with `.groups` argument)
# A tibble: 3 x 10
# Groups:   ID [3]
     ID Name                       m1    m2    m3    m4    m5    m6    m7    m8
  <dbl> <chr>                   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1    37 "Grötlingbo Roes II"        0     1     1     0     1     0     0     0
2    38 "Hablingbo Havor I"         0     1     1     1     0     1     0     0
3   123 "Hablingbo Havor III"       0     0     0     0     0     0     1     0

In base R , use aggregate

aggregate(.~ ID + Name, df, sum)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM