【问题标题】:Turn rows to columns, then stack into single column using R将行转换为列,然后使用 R 堆叠成单列
【发布时间】:2020-03-27 18:11:14
【问题描述】:

我有一个数据框,我需要将其转换为用于小组研究。我想将我的行转换为列,然后将这些列堆叠成一列。我目前的数据:

STATE    1970   1971   1972   1973...2018
State-A  X      X      X      X       X
State-B  X      X      X      X       X
State-C  X      X      X      X       X

我需要什么:

Year   State  Data
1970    A      X
1971    A      X
...
2018    A      X
1970    B      X
1971    B      X

等等……

我已经尝试过堆栈、融化和重塑功能,但均无济于事。我还尝试列出我的数据然后将其展平,这完全是一场灾难。非常感谢任何帮助!

【问题讨论】:

  • 您更新的数据与之前的格式相同。我认为唯一需要更改的是pivot_longer(cols = -STATE, names_to = 'Year', values_to = 'Data'),因为列名已从“年份”更改为“状态”

标签: r list stack reshape meld


【解决方案1】:

我们可以使用tidyverse

library(dplyr)
library(tidyr)
df1 %>%
     pivot_longer(cols = -Year, values_to = 'Data') %>% 
    c
# A tibble: 12 x 3
#   Year  State Data 
#   <chr> <chr> <chr>
# 1 1970  A     X    
# 2 1971  A     X    
# 3 1972  A     X    
# 4 1973  A     X    
# 5 1970  B     X    
# 6 1971  B     X    
# 7 1972  B     X    
# 8 1973  B     X    
# 9 1970  C     X    
#10 1971  C     X    
#11 1972  C     X    
#12 1973  C     X 

更新

对于更新后的示例,变化是

df1 %>%
   pivot_longer(cols = -STATE, names_to = 'Year', values_to = 'Data')

如果tidyr的包版本旧,请使用gather

df1 %>%
    gather(name, Data, -Year) %>%
    separate(Year, into = c('other', 'State')) %>%
    select(Year = name, State, Data)

melt

library(data.table)
melt(setDT(df1), id.var = 'Year', value.name = 'Data')[, 
    .(State = sub('.*-', '', Year), Year = variable, Data)]

数据

df1 <- structure(list(Year = c("State-A", "State-B", "State-C"), `1970` = c("X", 
"X", "X"), `1971` = c("X", "X", "X"), `1972` = c("X", "X", "X"
), `1973` = c("X", "X", "X")), class = "data.frame", row.names = c(NA, 
-3L))

【讨论】:

  • 我在使用 pivot_longer 命令时遇到问题:这是我得到的错误标志:pivot_long(., cols = STATE, values_to = "Data") 中的错误:找不到函数“pivot_long”我已经更新了我的 tidyverse 包以及 tidyr 和 dplyr 包。有什么建议吗?
  • @JeffB 可能是你有一个旧的tidyr 包版本。我的版本是1.0.0,因为添加了pivot_longer >= 1.0.0
  • @JeffB ii 更新了一个适用于旧版本的选项
  • 我还不太明白。我更新了我的示例以使其更清晰。我无法让我的 R Studio 更新到最新版本的 Tidyr。我想我在收集阶段输入数据时遇到问题....我有 50 列,包括第一个 STATE 列,并且输入数据为:DF[,c(2:50)。这是我的问题吗?
  • 这把我带到了我想去的地方!非常感谢!
猜你喜欢
  • 1970-01-01
  • 2021-03-18
  • 2015-04-25
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
  • 2021-12-14
  • 2013-04-01
  • 1970-01-01
相关资源
最近更新 更多