我有一个数据框,其中包含一些相同的名称,并希望得到一些相关数字的基本统计数据。最初,数据看起来像这样:
name res1 res2 res3
foo 1.1 NA 10
foo 2.4 NA 2.1
foo NA 1 1.2
bar 1 2 3
为了获得统计数据,我想要嵌套这样的数据:
name res1 res2 res3
foo [1.1,2.4] [1] [10,2.1,1.2]
bar [1] [2] [3]
这将是一个步骤,例如获取每个向量的均值和S.D等。即我然后会为res1的平均值,res1的SD等添加列。如何根据列中相同的值嵌套我的数据框?
答案 0 :(得分:2)
虽然我同意thelatemail的建议,但您可以使用dplyr
获得所需的输出:
library(dplyr)
dtf %>% group_by(name) %>% summarize_all( ~ list(.[!is.na(.)]))
# # A tibble: 2 x 4
# name res1 res2 res3
# <fctr> <list> <list> <list>
# 1 bar <dbl [1]> <int [1]> <dbl [1]>
# 2 foo <dbl [2]> <int [1]> <dbl [3]>
数据:
dtf <- read.table(textConnection('name res1 res2 res3
foo 1.1 NA 10
foo 2.4 NA 2.1
foo NA 1 1.2
bar 1 2 3'), header = TRUE)
答案 1 :(得分:0)
我花了几个小时,但是我制定了一个基于thelatemail comment创建长版本的策略。
输入数据(感谢code的mt1022)。
dat <- read.table(textConnection('
name res1 res2 res3
foo 1.1 NA 10
foo 2.4 NA 2.1
foo NA 1 1.2
bar 1 2 3'), header = TRUE)
根据评论创建长版:
long <- cbind(dat["name"], stack(dat[-1]))
根据here,使用ddply输出统计信息。
library(plyr)
ddply(long, c("name","ind"), summarise,
count = length(values[!is.na(values)]),
mean = mean(values[!is.na(values)]),
sd = sd(values[!is.na(values)]),
sem = sd(values[!is.na(values)])/sqrt(length(values[!is.na(values)])))
答案 2 :(得分:0)
tidyverse
通过nest
和map
mydf <- structure(list(name = c("foo", "foo", "foo", "bar"), res1 = c(1.1,
2.4, NA, 1), res2 = c(NA, NA, 1L, 2L), res3 = c(10, 2.1, 1.2,
3)), .Names = c("name", "res1", "res2", "res3"), row.names = c(NA,
-4L), class = c("data.table", "data.frame"))
library(tidyverse)
# nest 'other'-columns by `name` group
nesteddf <- mydf %>%
group_by(name) %>%
nest()
# name data
# <chr> <list>
# 1 foo <tibble [3 x 3]>
# 2 bar <tibble [1 x 3]>
# perform operations on nested data with `mutate(data = map(data, ~...)`
stats <- nesteddf %>%
mutate(data = map(data, ~mean(.x$res3, na.rm=TRUE))) %>%
unnest(data)
# name data
# <chr> <dbl>
# 1 foo 4.433333
# 2 bar 3.000000