我有一个像这样的数据框
v1 v2 v3
A332 as 1
A333 sm 0.75
A333 lx 0.25
A334 as 0.25
A334 sm 0.25
A334 tp 0.2
A334 dp 0.2
A334 lp 0.1
A335 dp 0.5
A335 tp 0.5
我想为V1选择V3的最大值并获得以下矩阵,如果有超过1个最大值,那么我想保留它们全部。并得到以下矩阵
v1 v2 v3
A332 as 1
A333 sm 0.75
A334 as 0.25
A334 sm 0.25
A335 dp 0.5
A335 tp 0.5
之后我想以这种方式安排
v1 v2 v3 v2 v3 v2 v3
A332 as 1
A333 sm 0.75 as 0.25
A334 sm 0.25 dp 0.5 tp 0.5
我怎么能用R做,我可以使用任何包? 非常感谢
答案 0 :(得分:1)
对于问题的第一部分,ave
应该有效:
ind <- ave(df$v3, df$v1, FUN = max) == df$v3
df[ind,]
对于第二部分,我只是使用split
列出一个列表:
split(df, df$v1)
答案 1 :(得分:0)
问题的第一部分可以通过dplyr
实现:
library(dplyr)
df %>%
group_by(v1) %>%
filter(v3 == max(v3))
# Source: local data frame [6 x 3]
# Groups: v1 [4]
#
# v1 v2 v3
# (fctr) (fctr) (dbl)
# 1 A332 as 1.00
# 2 A333 sm 0.75
# 3 A334 as 0.25
# 4 A334 sm 0.25
# 5 A335 dp 0.50
# 6 A335 tp 0.50
对于第二部分,我相信这可能是您想要的,可以通过tidyr
来实现:
library(tidyr)
df %>%
group_by(v1) %>%
filter(v3 == max(v3)) %>%
mutate(v1_v2 = paste(v1, v2, sep = "-")) %>%
select(-v1, -v2) %>%
spread(v1_v2, v3)
# Source: local data frame [4 x 7]
#
# v1 A332-as A333-sm A334-as A334-sm A335-dp A335-tp
# (fctr) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl)
# 1 A332 1 NA NA NA NA NA
# 2 A333 NA 0.75 NA NA NA NA
# 3 A334 NA NA 0.25 0.25 NA NA
# 4 A335 NA NA NA NA 0.5 0.5
答案 2 :(得分:0)
您可以使用aggregate
或tapply
#recreate dataset
df = data.frame(t(matrix(nrow=3,data=c(
"A332", "as", 1,
"A333", "sm", 0.75,
"A333", "lx", 0.25,
"A334", "as", 0.25,
"A334", "sm", 0.25,
"A334", "tp", 0.2,
"A334", "dp", 0.2,
"A334", "lp", 0.1,
"A335", "dp", 0.5,
"A335", "tp", 0.5))))
names(df)=c("v1","v2","v3")
df$v3 = as.numeric(as.vector(df$v3))
aggregate(df[,3],by=df[,1:2],max)
v1 v2 x
1 A332 as 1.00
2 A334 as 0.25
3 A334 dp 0.20
4 A335 dp 0.50
5 A334 lp 0.10
6 A333 lx 0.25
7 A333 sm 0.75
8 A334 sm 0.25
9 A334 tp 0.20
10 A335 tp 0.50
tapply(X=df[, 3], INDEX=list(df$v1, df$v2), FUN=max)
as dp lp lx sm tp
A332 1.00 NA NA NA NA NA
A333 NA NA NA 0.25 0.75 NA
A334 0.25 0.2 0.1 NA 0.25 0.2
A335 NA 0.5 NA NA NA 0.5