列の値に基づいてグループ化するデータフレームがあります。
秘訣は、グループ化する列に値がすでに表示されている場合にマージする必要のある行がいくつかあることです。
例えば:
df <- data.frame(col1 = c("R1", "R2", "R2", "R2", "R2", "R4", "R5", "R5", "R5"),
col2 = c("R10", "R4", "R5", "R6", "R7", "R5", "R6", "R7", "R9"), stringsAsFactors = FALSE)
df2 <- aggregate(col2 ~ col1, df, FUN = function(x) paste(unique(x), collapse = ", "))
> df
col1 col2
1 R1 R10
2 R2 R4
3 R2 R5
4 R2 R6
5 R2 R7
6 R4 R5
7 R5 R6
8 R5 R7
9 R5 R9
> df2
col1 col2
1 R1 R10
2 R2 R4, R5, R6, R7
3 R4 R5
4 R5 R6, R7, R9
R10はグループR1(行1)に含まれます
R4、R5、R6、およびR7はグループR2(行2から5)に含まれますR5はグループR4(行6)に含まれます
R6、R7、およびR9はグループR5に含まれます(行:7から9)
ただし、R4とR5はすでにR2にあるため、これはR2に残ります。元々R5に割り当てられていたR9の場合、R2にグループ化する必要があります。
したがって、望ましい結果は次のようになります。
> df3
col1 col2
1 R1 R10
2 R2 R4, R5, R6, R7, R9
またはできれば:
1 col1 col2
2 R1 R10
3 R2 R4
4 R2 R5
5 R2 R6
6 R2 R7
7 R2 R9
オプションはreplace
、intersect
ing要素に基づいて値を設定してから、aggregate
i1 <- df$col1 %in% df$col2
df$col1[i1] <- df$col1[match(df$col1[inds], df$col2)]
aggregate(col2 ~ col1, unique(df), FUN = toString)
# col1 col2
#1 R1 R10
#2 R2 R4, R5, R6, R7, R9
またはと tidyverse
library(dplyr)
library(stringr)
df %>%
group_by(col1 = case_when(col1 %in% intersect(col1, col2) ~ "R2",
TRUE ~ col1)) %>%
distinct %>%
summarise(col2 = toString(col2))
# A tibble: 2 x 2
# col1 col2
# <chr> <chr>
#1 R1 R10
#2 R2 R4, R5, R6, R7, R9
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加