我目前正在研究在实验室实验中生成的数据集,其中观察结果加倍(测量两次)。
我有ID
观察对象,value
结果,type
对象和hour
被测量(+120其他分类,字符和我想要的数字变量)。这是一个简化的数据框:
library(dplyr)
A <- c(1,1,2,2,3,3,4)
B <- A*2.5+(rnorm(2,A[A],sd = 0.2))
C <- c("banana","banana","poireau","poireau","melon","melon","kiwi")
D <- c("H1","H2","H3","H4","H5","H6","H7")
df <-data_frame(ID=as.integer(A),value=B,type=factor(C), hour=as.character(D))
df
# A tibble: 7 x 4
ID value type hour
<int> <dbl> <fctr> <chr>
1 1 3.337352 banana H1
2 1 3.398814 banana H2
3 2 5.837352 poireau H3
4 2 5.898814 poireau H4
5 3 8.337352 melon H5
6 3 8.398814 melon H6
7 4 10.837352 kiwi H7
我的目标是通过ID计算值的均值,以便只保留一个值,一个ID,但仍然保留其他变量。我试过的是:
df %>% group_by(ID) %>% summarise_if(is.double, mean)
# A tibble: 4 x 2
ID value
<int> <dbl>
1 1 3.368083
2 2 5.868083
3 3 8.368083
4 4 10.837352
正如您所看到的,dplyr会响应我的命令:它只表示双值,但如何保留其他列?
至于hour
字段,我希望保留表中的第一个值。期望的输出是:
# A tibble: 4 x 4
ID `mean(value)` type hour
<int> <dbl> <fctr> <chr>
1 1 3.368083 banana H1
2 2 5.868083 poireau H3
3 3 8.368083 melon H5
4 4 10.837352 kiwi H7
谢谢!
答案 0 :(得分:2)
我们可以mutate_if
然后使用distinct
library(dplyr)
df %>%
group_by(ID) %>%
mutate_if(is.double, mean) %>%
distinct(ID, value, .keep_all = TRUE)
# A tibble: 4 x 4
# Groups: ID [4]
# ID value type hour
# <int> <dbl> <fctr> <chr>
#1 1 3.368083 banana H1
#2 2 5.868083 poireau H3
#3 3 8.368083 melon H5
#4 4 10.837352 kiwi H7
答案 1 :(得分:1)
重要的是,你只是指double
个变量吗?这是一个代码,适用于您的示例:
df %>% group_by(ID) %>% summarise(value = mean(value), type = first(type), hour = first(hour))
# A tibble: 4 x 4
ID value type hour
<int> <dbl> <fctr> <chr>
1 1 3.312154 banana H1
2 2 5.812154 poireau H3
3 3 8.312154 melon H5
4 4 10.690296 kiwi H7