转置数据框并将第一列用作索引

问题描述

我有一个结构如下的数据框,其中A / B / C / D是不同的处理方法

input <- read.table(text="
filename wavelength  A    B    C    D
file1      w1        NA   NA   1   2
file1      w2        NA   NA   3   2
file1      w3        NA   NA   6   2
file2      w1        3    4    NA   NA
file2      w2        4    8    NA   NA
file2      w3        6    1    NA   NA",header=TRUE)

我希望对其进行转置,以使波长为标头,并且处理为每次都重复文件名的行:

desired <- read.table(text="
filename Method   w1    w2   w3 
 file1      C     1    3     6
 file1      D     2    2     2
 file2      A     3    4     6 
 file2      B     4    8     1",header=TRUE)

我尝试了melt/cast中的reshape2melt软件包,data.tablegather/spread中的t-我能想到的一切。最后的实际数据帧将是约500行乘3500列-因此,我宁愿不调用任何特定的列或方法名称。我的问题似乎主要是我无法在一个值下调用所有方法列并使用它来融化:

colMethods <- myData[,2:length(myData)]

很多时候我都没有报错,但数据帧R返回的只是波长列表和一列表示“波长”的列。你们每个人将如何处理?谢谢!

解决方法

您可以尝试以下方法:

library(tidyverse)
#Data
df <- structure(list(filename = c("file1","file1","file2","file2"),wavelength = c("w1","w2","w3","w1","w3"),A = c(NA,NA,3L,4L,6L),B = c(NA,8L,1L),C = c(1L,6L,NA),D = c(2L,2L,NA)),class = "data.frame",row.names = c(NA,-6L))

代码:

df %>% pivot_longer(cols = -c(1,2)) %>% filter(!is.na(value)) %>%
  pivot_wider(names_from = wavelength,values_from = value)

输出:

# A tibble: 4 x 5
  filename name     w1    w2    w3
  <chr>    <chr> <int> <int> <int>
1 file1    C         1     3     6
2 file1    D         2     2     2
3 file2    A         3     4     6
4 file2    B         4     8     1
,

这是data.table的替代方案,使用meltdcast

library(data.table)

dcast(melt(setDT(input),id.vars = 1:2,na.rm = TRUE),variable+filename~wavelength,value.var = 'value')

#   variable filename w1 w2 w3
#1:        A    file2  3  4  6
#2:        B    file2  4  8  1
#3:        C    file1  1  3  6
#4:        D    file1  2  2  2