【问题标题】:Reshaping data in R for multiple value types [duplicate]为多种值类型重塑R中的数据[重复]
【发布时间】:2020-01-31 20:17:34
【问题描述】:

这是一个相对简单的问题,但我遇到了一些问题(提前感谢您!)。我的数据看起来像这样(最小的工作示例):

df <- data.frame(
  ID = c("A","A","A"),
  org = c("USA","CHN","CHN"),
  partner = c("USA","USA","MEX")
)

> df
  ID org partner
1  A USA     USA
2  A CHN     USA
3  A CHN     MEX

但是,我希望它看起来像这样:

df_wide <- data.frame(
  ID = c("A"),
  org1 = c("USA"),
  org2 = c("CHN"),
  partner1 = c("USA"),
  partner2 = c("MEX")
)

> df_wide
  ID org1 org2 partner1 partner2
1  A  USA  CHN      USA      MEX

注意:数据有很多行和 ID。每个 ID 都与未知数量的原产国和未知数量的合作伙伴国家相关联。因此,例如,我不想强制要求每个 ID 最多有 2 个原产国。

另外,我怎样才能让数据看起来像这样?

df_wide2 <- data.frame(
  ID = c("A")
)
df_wide2$org = list(c("USA","CHN"))
df_wide2$partner = list(c("USA","MEX"))

> df_wide2
  ID      org  partner
1  A USA, CHN USA, MEX

【问题讨论】:

    标签: r


    【解决方案1】:

    通过'ID'分组后,我们可以得到unique元素和paste

    library(dplyr)
    df %>%
        group_by(ID) %>%
        summarise_at(vars(-group_cols()), ~ toString(unique(.)))
    # A tibble: 1 x 3
    #   ID    org      partner 
    #  <fct> <chr>    <chr>   
    #1 A     USA, CHN USA, MEX
    

    【讨论】:

    • 谢谢!我无法测试这个,因为它需要很长时间才能运行。你知道这里的问题是什么吗?我的数据有 250 万个观测值。
    • @H.Z 你能在新的 R 会话上尝试library(data.table);setDT(df)[, lapply(.SD, function(x) toString(unique(x))), by = ID]
    猜你喜欢
    • 1970-01-01
    • 2014-11-09
    • 2017-04-05
    • 1970-01-01
    • 2010-12-04
    • 2017-09-06
    • 2015-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多