【问题标题】:Reshaping a data frame from wide to long in R [duplicate]在R中从宽到长重塑数据框[重复]
【发布时间】:2015-11-22 00:11:14
【问题描述】:

我有以下数据框,其中包含来自 3 个传感器的温度和压力数据:

df <- data.frame(
         Test = 1:10, 
         temperature_sensor1=rnorm(10,25,5), 
         temperature_sensor2 = rnorm(10,25,5), 
         temperature_sensor1 = rnorm(10,25,5), 
         pressure_sensor1 = rnorm(10,10,2),
         pressure_sensor2 = rnorm(10,10,2), 
         pressure_sensor3 = rnorm(10,10,2))

我如何将其改造成长格式,以便每一行都有单个传感器的温度和压力数据

Test Sensor Temperature Pressure

谢谢!

【问题讨论】:

  • gatherdplyr 包中
  • 大家好,可以举个例子吗?我想不通。非常感谢!
  • 这个问题比假设的重复更复杂,因为它有两组列,而被引用为假设重复的列只有一组。

标签: r reshape reshape2


【解决方案1】:

这里有几种方法:

1) dplyr/tidyr 使用gatherdf 转换为长格式,然后用下划线将生成的variable 列分隔为两列。最后根据variable 列(包含字符串pressuretemperaturevalue 列(包含数字))从长转换为宽:

library(dplyr)
library(tidyr)
df %>% 
   gather("variable", "value", -Test) %>% 
   separate(variable, c("variable", "sensor"), sep = "_") %>%
   spread(variable, value)

2) 可以使用reshape。不需要包裹。标记为可选的行将删除行名。如果没关系,可以省略。

unames <- grep("_", names(df), value = TRUE)

varying <- split(unames, sub("_.*", "", unames))
sensors <- unique(sub(".*_", "", unames))

long <- reshape(df, dir = "long", varying = varying, v.names = names(varying),
         times = sensors, timevar = "sensor")
rownames(long) <- NULL # optional

如果df 有固定列,那么我们可以通过硬编码varyingsensors 来简化上面的代码,使用这些定义代替上面更复杂但更通用的代码:

varying <- list(pressure = 2:4, temperature = 5:7)
sensors <- c("sensor1", "sensor2", "sensor3")

注意:要重复创建df,我们必须首先设置种子,因为使用了随机数,所以为了确定,我们像这样创建了df。另请注意,在问题中temperature_sensor1 用于两列,我们假设第二次出现是temperature_sensor3

set.seed(123)
df <- data.frame(
         Test = 1:10, 
         temperature_sensor1=rnorm(10,25,5), 
         temperature_sensor2 = rnorm(10,25,5), 
         temperature_sensor3 = rnorm(10,25,5), 
         pressure_sensor1 = rnorm(10,10,2),
         pressure_sensor2 = rnorm(10,10,2), 
         pressure_sensor3 = rnorm(10,10,2))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    • 1970-01-01
    • 2016-06-27
    • 1970-01-01
    相关资源
    最近更新 更多