【问题标题】:Uniting several rows of data frame联合多行数据框
【发布时间】:2021-12-17 21:24:39
【问题描述】:

有没有办法将数据框的多行与多列联合起来?

我有来自不同动物器官的数据 - 我想对比个人的器官。 一行应仅包含个体的测量值,但来自所有采样器官(列)。 任何想法?我试过了,melt命令没管。

这是我的一些数据:

structure(list(ID = c("BB1", "BB1", "BB1"), ID.organ = c("BB1-B", 
"BB1-L", "BB1-M"), d15NAIR = c(6.244803447, 5.263374719, 6.28820367
), brain = c(-31.00047084, NA, NA), eyes = c(NA_real_, NA_real_, 
NA_real_), liver = c(NA, -30.8483728, NA), muscle = c(NA, NA, 
-29.67755736)), row.names = c(NA, 3L), class = "data.frame")

【问题讨论】:

  • 记得给你的问题加上R标签,让大家知道问题属于哪种语言

标签: r rows melt


【解决方案1】:

你在使用 melt 的正确方法,你只需要确定你使用的是哪个 melt 函数 data.table::melt 或 reshape2::melt,有很多方法可以做到这一点看看在答案here

这里有一些你的数据:

mydata <- structure(list(ID = c("BB1", "BB1", "BB1"), 
                          ID.organ = c("BB1-B",  "BB1-L", "BB1-M"), 
                          d15NAIR = c(6.244803447, 5.263374719, 6.28820367),
                          brain = c(-31.00047084, NA, NA), 
                          eyes = c(NA_real_, NA_real_, NA_real_),
                          liver = c(NA, -30.8483728, NA), 
                          muscle = c(NA, NA, -29.67755736)), 
                     row.names = c(NA, 3L), 
                     class = "data.frame")

library(reshape2)
melt(mydata, id.vars=c("ID", "ID.organ",  "d15NAIR"), na.rm = TRUE)

library(tidyr)
gather(mydata, organ, value, c("brain", "liver", "muscle"), na.rm = TRUE)

#     ID ID.organ  d15NAIR variable     value
# 1  BB1    BB1-B 6.244803    brain -31.00047
# 8  BB1    BB1-L 5.263375    liver -30.84837
# 12 BB1    BB1-M 6.288204   muscle -29.67756

【讨论】:

    【解决方案2】:

    虽然看起来有点愚蠢,但我找到了解决方案,因为平均值不是计算实际算术平均值:

    my_data <- my_data[,-c(2,3)] %>%
      pivot_longer(cols = brain:muscle) 
        
    acast(my_data, ID ~ name, mean,na.rm=T)
    

    然后取原来的值。

    【讨论】:

      猜你喜欢
      • 2015-10-02
      • 1970-01-01
      • 2014-05-02
      • 1970-01-01
      • 2021-05-15
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 2020-06-25
      相关资源
      最近更新 更多