【问题标题】:R Long to Wide: Working with Lists in DataframeR 从长到宽:使用数据框中的列表
【发布时间】:2018-04-19 01:30:29
【问题描述】:

我以具有唯一标识符的键值格式获取数据。 key 是变量,它们的值存储在value 中。 ID 标识收集它们的时间。因此:

data <- data.table(ID=c(1, 1, 2, 1, 3, 1, 1, 3, 2), key=c("A", "A","A","B", "B", "B", "B", "C", "C"), value=c(6,7,3,5,8,11,7,8,7))

 #   ID key  value
 #1  1   A     6
 #2  1   A     7
 #3  2   A     3
 #4  1   B     5
 #5  3   B     8
 #6  1   B     11
 #7  1   C     7
 #8  3   C     8
 #9  2   C     7

我希望能够使用以下功能:

  • 可视化:ggplot::ggplot,
  • 过滤/子集:dplyr::filter,dplyr::select
  • 分组:dplyr::group_by,摘要:dplyr::summarise
  • 统计测试:stats::aggregate,stats::t.test,stats::shapiro.test,stats::fligner.test,stats::pairwise.t.test,stats::kruskal.test,nlme::lme,car::leveneTest,ez:ezANOVA

我有两个主要问题

  1. dplyr 相关函数假定您具有宽格式。 因此,我怎么能filter/group_by,summarise?具体来说,如果我想拥有Amean group_by B 只有当C &gt; 10
  2. 在性能方面,我很快就有几百万base::nrow,会不会有影响?

这种键值长格式方法还有其他风险吗?

每次我需要使用上述某些功能时,我是否应该重新塑造? 我应该将所有内容存储在一个带有列表的宽数据框中(见下文)吗?

这是我认为可行的示例

假设我有一个长数据框,其中包含多个值 (temp) 用于同一个键 (year)。即使在相同值多次出现的情况下,我也希望能够将其表示为宽数据。我怎样才能在 R 中最好地实现这一点?

看起来像:

# Create long dataset
library(data.table)
country_long <- data.table(country=c("Sweden", "Sweden", "Norway", "Sweden", "Denmark","Sweden", "Sweden", "Denmark", "Norway"), year=c("Y1994", "Y1994","Y1994","Y1995", "Y1995", "Y1995", "Y1996", "Y1996", "Y1996"), temp=c(6,7,3,5,8,11,7,8,7))
country_long

   #country year    temp
 #1  Sweden Y1994       6
 #2  Sweden Y1994       7
 #3  Norway Y1994       3
 #4  Sweden Y1995       5
 #5 Denmark Y1995       8
 #6  Sweden Y1995      11
 #7  Sweden Y1996       7
 #8 Denmark Y1996       8
 #9  Norway Y1996       7

我想让它变宽,以便当有多个temp 时,将其放入list()。人们通常使用reshape2tidyr,但我不确定当每个键有多个值时它是如何工作的。它看起来像:

country_wide <-data.table(country = c("Sweden", "Denmark", "Norway"),Y1994=list(c(6,7),"",3),Y1995=list(c(5,11),8,""),Y1996=c(7,8,7))

country_wide 
#country      Y1994    Y1995       Y1996
#1 Sweden     6,7       5,11         7
#2 Denmark                 8         8
#3 Norway     3                      7

最后,如何从那里传播具有多个值的一列? tidyr:gather() 之类的东西可以工作,但我不确定如何将其应用于这种情况。

country_wide_expended <-data.table(country = c("Sweden","Sweden","Denmark", "Norway"),k=c(1,2,1,1), Y1994=list(6,7,"",3),Y1995=list(c(5,11),c(5,11),8,""),Y1996=c(7,7,8,7))
country_wide_expended 
#country       k  Y1994    Y1995    Y1996
#1 Sweden      1     6       5,11      7
#1 Sweden      2     7       5,11      7
#2 Denmark     1              8        8
#3 Norway      1     3                 7

然后我可以使用这个数据框来分析(lm、lme、t-test...)和可视化(ggplot)Y1994

(改编自https://sejdemyr.github.io/r-tutorials/basics/wide-and-long/

【问题讨论】:

  • 使用 set.seed 确保我们正在查看相同的示例数据。同样因为您使用的是 expand.grid,所以您描述的现象不会出现——每个国家/地区-年组合恰好有一个 obs
  • @Frank,我编辑了代码。 SwedenY1994Y1995 中有两次出现。
  • 你想要的结果是什么?长格式是大多数数据分析和大多数数据存储(如数据库中的规范化)的首选结构。通常重塑/透视是为了报告需要。嵌套列表如何在lm()t.test() 过程中提供帮助?几乎我所知道的每一种情况,嵌套列表都不是一个好主意。
  • 好的,谢谢。由于您使用的是 data.table,可能是dcast(country_long, country ~ year, fun = list),它应该与 reshape2 一样工作。我同意 Parfait 的观点,即这种格式对于 R 中的大多数分析都没有用,仅用于浏览或发布。
  • 您的问题是XY Problem。您正在寻求 Y 解决方案的帮助,而不是 X 问题。为什么需要在数据框中使用嵌入式列表?什么分析需要这种格式?告诉我们真正的原因,我们可以提供帮助。

标签: r list dataframe


【解决方案1】:

要使数据框变宽,您可以使用 t() 函数。 这里-

> data <- data.table(ID=c(1, 1, 2, 1, 3, 1, 1, 3, 2), key1=c("A", 
"A","A","B", "B", "B", "B", "C", "C"), value=c(6,7,3,5,8,11,7,8,7))
> data
 ID key1 value
1:  1    A     6
2:  1    A     7
3:  2    A     3
4:  1    B     5
5:  3    B     8
6:  1    B    11
7:  1    B     7
8:  3    C     8
9:  2    C     7
> t(data)
  [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
ID    "1"  "1"  "2"  "1"  "3"  "1"  "1"  "3"  "2" 
key1  "A"  "A"  "A"  "B"  "B"  "B"  "B"  "C"  "C" 
value " 6" " 7" " 3" " 5" " 8" "11" " 7" " 8" " 7"

关于你的其他问题,这有点困难 明白。请解释清楚。喜欢-

1.您要执行什么样的分析。 2.您希望以哪种格式查看数据以进行分析。

回答这些问题将有助于我进一步为您提供帮助。

谢谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-20
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    • 2021-01-03
    • 2022-08-14
    • 2021-10-23
    相关资源
    最近更新 更多