R 确定子集行中出现的最多/最少数量&;数据帧中的列组
我试图在一个较大的数据框中查找行/列组中最多和最少的项。以下是更清楚的数据:R 确定子集行中出现的最多/最少数量&;数据帧中的列组,r,dataframe,dplyr,R,Dataframe,Dplyr,我试图在一个较大的数据框中查找行/列组中最多和最少的项。以下是更清楚的数据: df <- data.frame(matrix(nrow = 8, ncol = 3)) df$X1 <- c(1, 1, 1, 2, 2, 3, 3, 3) df$X2 <- c("yellow", "green", "yellow", "blue", NA, "orange", NA, "orange") df$X3 <- c("green", "yellow", NA, "blue",
df <- data.frame(matrix(nrow = 8, ncol = 3))
df$X1 <- c(1, 1, 1, 2, 2, 3, 3, 3)
df$X2 <- c("yellow", "green", "yellow", "blue", NA, "orange", NA, "orange")
df$X3 <- c("green", "yellow", NA, "blue", "red", "purple" , "orange", NA)
names(df) <- c("group", "A", "B")
df解决方案使用dplyr
和tidyr
。策略是找到“最多”和“最少”项,并准备一个新的数据框架。然后,使用right\u join
合并原始数据帧并准备所需的输出
请注意,在这个过程中,我使用了slice
对数据帧进行子集划分,以获得最多和最少的项。这保证了每组只有一个“最多”和一个“最少”。尽管如此,每个小组都有可能打成平局。如果发生这种情况,你可能会想一想什么是一个好的规则来确定哪一个是“最”的或哪一个是“最少的”
库(dplyr)
图书馆(tidyr)
df2%
聚集(列,值,-组,na.rm=TRUE)%>%
计数(组、值)%>%
排列(组,描述(n))%>%
分组依据(分组)%>%
切片(c(1,n())%>%
变异(类型=c(“最”、“最”和“最少”))%>%
选择(-n)%>%
排列(类型、值)%>%
右键联接(df,by=“group”)%>%
选择(c(colnames(df),“most”,“least”))
df2
#一个tibble:8x5
A、B组最差
1黄绿色黄绿色
2 1绿色-黄色-黄色-绿色
3 1黄-黄-绿
4 2蓝-蓝-红
5.2红蓝红
橙紫橙紫
7.3橙橙紫
8.3橙橙紫
解决方案使用dplyr
和tidyr
。策略是找到“最多”和“最少”项,并准备一个新的数据框架。然后,使用right\u join
合并原始数据帧并准备所需的输出
请注意,在这个过程中,我使用了slice
对数据帧进行子集划分,以获得最多和最少的项。这保证了每组只有一个“最多”和一个“最少”。尽管如此,每个小组都有可能打成平局。如果发生这种情况,你可能会想一想什么是一个好的规则来确定哪一个是“最”的或哪一个是“最少的”
库(dplyr)
图书馆(tidyr)
df2%
聚集(列,值,-组,na.rm=TRUE)%>%
计数(组、值)%>%
排列(组,描述(n))%>%
分组依据(分组)%>%
切片(c(1,n())%>%
变异(类型=c(“最”、“最”和“最少”))%>%
选择(-n)%>%
排列(类型、值)%>%
右键联接(df,by=“group”)%>%
选择(c(colnames(df),“most”,“least”))
df2
#一个tibble:8x5
A、B组最差
1黄绿色黄绿色
2 1绿色-黄色-黄色-绿色
3 1黄-黄-绿
4 2蓝-蓝-红
5.2红蓝红
橙紫橙紫
7.3橙橙紫
8.3橙橙紫
两个选项:
重塑为长格式,并使用汇总
(或计数
)进行聚合,将which.max
/which.min
子集:
库(tidyverse)
df%
聚集(变量、颜色、A:B)%>%
下拉菜单(颜色)%>%
分组依据(组,颜色)%>%
总结(n=n())%>%
总结(most=颜色[which.max(n)],
最小值=颜色[which.min(n)])%>%
左联合(df,)
#>加入,由=“集团”
#>#A tibble:8 x 5
#>A、B组最差
#>
#>1黄绿色黄绿色
#>2 1绿色-黄色-黄色-绿色
#>3 1黄-黄-绿
#>4 2蓝-蓝-红
#>5.2红蓝红
#>橙紫橙紫
#>7.3橙橙紫
#>8.3橙橙紫
对值表进行排序并将其子集:
df%>%
分组依据(分组)%>%
mutate(most=姓氏(sort(表(c(A,B)'))),
最小值=第一个(名称(排序)(表(c(A,B);))))
#>#A tibble:8 x 5
#>#组:组[3]
#>A、B组最差
#>
#>1黄绿色黄绿色
#>2 1绿色-黄色-黄色-绿色
#>3 1黄-黄-绿
#>4 2蓝-蓝-红
#>5.2红蓝红
#>橙紫橙紫
#>7.3橙橙紫
#>8.3橙橙紫
两种选择:
重塑为长格式,并使用汇总
(或计数
)进行聚合,将which.max
/which.min
子集:
库(tidyverse)
df%
聚集(变量、颜色、A:B)%>%
下拉菜单(颜色)%>%
分组依据(组,颜色)%>%
总结(n=n())%>%
总结(most=颜色[which.max(n)],
最小值=颜色[which.min(n)])%>%
左联合(df,)
#>加入,由=“集团”
#>#A tibble:8 x 5
#>A、B组最差
#>
#>1黄绿色黄绿色
#>2 1绿色-黄色-黄色-绿色
#>3 1黄-黄-绿
#>4 2蓝-蓝-红
#>5.2红蓝红
#>橙紫橙紫
#>7.3橙橙紫
#>8.3橙橙紫
对值表进行排序并将其子集:
df%>%
分组依据(分组)%>%
mutate(most=姓氏(sort(表(c(A,B)'))),
最小值=第一个(名称(排序)(表(c(A,B);))))
#>#A tibble:8 x 5
#>#组:组[3]
#>A、B组最差
#>
#>1黄绿色黄绿色
#>2 1绿色-黄色-黄色-绿色
#>3 1黄-黄-绿
#>4 2蓝-蓝-红
#>5.2红蓝红
#>橙紫橙紫
#>7.3橙橙紫
#>8.3橙橙紫
这正是我要找的!我一直在为我的原始数据修改它,我可以修改它
group A B
1 1 yellow green
2 1 green yellow
3 1 yellow <NA>
4 2 blue blue
5 2 <NA> red
6 3 orange purple
7 3 <NA> orange
8 3 orange <NA>
group A B most least
1 1 yellow green yellow green
2 1 green yellow yellow green
3 1 yellow <NA> yellow green
4 2 blue blue blue red
5 2 <NA> red blue red
6 3 orange purple orange purple
7 3 <NA> orange orange purple
8 3 orange <NA> orange purple
library(dplyr)
library(tidyr)
df2 <- df %>%
gather(Column, Value, -group, na.rm = TRUE) %>%
count(group, Value) %>%
arrange(group, desc(n)) %>%
group_by(group) %>%
slice(c(1, n())) %>%
mutate(Type = c("most", "least")) %>%
select(-n) %>%
spread(Type, Value) %>%
right_join(df, by = "group") %>%
select(c(colnames(df), "most", "least"))
df2
# A tibble: 8 x 5
group A B most least
<dbl> <chr> <chr> <chr> <chr>
1 1 yellow green yellow green
2 1 green yellow yellow green
3 1 yellow <NA> yellow green
4 2 blue blue blue red
5 2 <NA> red blue red
6 3 orange purple orange purple
7 3 <NA> orange orange purple
8 3 orange <NA> orange purple