如何根据列中的相同值嵌套数据框?

问题描述 投票:0回答:3

我有一个数据框,其中有一些相同的名称,并且希望获得一些相关数字的一些基本统计数据。最初,数据是这样的:

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]

这将是一个执行诸如获取每个向量的平均值和标准差等操作的步骤。即,然后我将添加 res1 的平均值、res1 的 SD 等列。如何根据列中的相同值嵌套数据框?

r dataframe
3个回答
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)

0
投票

我花了几个小时,但我根据latemail的评论制定了一个策略,创建一个长版本。

输入数据(感谢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)])))

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
© www.soinside.com 2019 - 2024. All rights reserved.