【问题标题】:Transform Data Frame Elements Into a Summary Table将数据框元素转换为汇总表
【发布时间】:2018-02-22 04:47:20
【问题描述】:

我有一个数据框,我想创建一个包含所有单元格值及其行名和列名的表格。例如,

a <- c(1:4)
df <- matrix(a, nrow = 2, ncol = 2, byrow = T)
rownames(df) <- c("Paul", "Matt")
colnames(df) <- c("Beach", "Hike")
df <- as.data.frame(df)
df

我希望输出是具有以下列的数据框:

Paul | 1 | Beach
Paul | 2 | Hike
Matt | 3 | Beach
Matt | 4 | Hike

我需要对一个非常大的数据集的所有行和列组合的数值进行排序,所以如果有人可以帮助我,那就太棒了:)

谢谢!

【问题讨论】:

标签: r dataframe split


【解决方案1】:

如果你不关心dfrownames,你可以使用base R 的stack

stack(df);
#  values   ind
#1      1 Beach
#2      3 Beach
#3      2  Hike
#4      4  Hike

tidyverse 方法:

require(tidyverse);
df %>% 
    gather(key, values, 1:2) %>% 
    mutate(id = rep(rownames(df), ncol(df))) %>% 
    arrange(desc(id));
#    key values   id
#1 Beach      1 Paul
#2  Hike      2 Paul
#3 Beach      3 Matt
#4  Hike      4 Matt

【讨论】:

  • 或者只是把行名放回去 - cbind(name=rownames(df), stack(df))
【解决方案2】:
 library(tidyverse)
  df %>% 
  rownames_to_column(var="name") %>% 
  gather(key,value,-name) %>% 
  arrange(value)

  name   key value
1 Paul Beach     1
2 Paul  Hike     2
3 Matt Beach     3
4 Matt  Hike     4

【讨论】:

    【解决方案3】:
    res_df = data.frame()
    for(x in rownames(df)){
       for(y in colnames(df)){
          res_df = rbind(res_df, as.data.frame(t(c(person=x, count=df[x,y], activity=y))))
       }
    }
    
    
      person count activity
    1   Paul     1    Beach
    2   Paul     2     Hike
    3   Matt     3    Beach
    4   Matt     4     Hike
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-11
      • 2013-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-11
      • 2013-03-25
      相关资源
      最近更新 更多