R 转置数据帧并使用第一列作为索引

R 转置数据帧并使用第一列作为索引,r,transpose,melt,R,Transpose,Melt,我有一个如下结构的数据框,其中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

我有一个如下结构的数据框,其中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)
很多时候,我没有得到一个错误,但数据帧R返回的只是一个波长列表和一列,上面写着“波长”。你们中有谁会这样做?谢谢

您可以尝试以下方法:

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

# 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
您可以尝试以下方法:

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

# 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
以下是使用melt和dcast的data.table替代方案:

以下是使用melt和dcast的data.table替代方案:


@弗利克先生,谢谢!很好@弗利克先生,谢谢!很好@穆利根:太好了,这很有帮助!如果你认为这个答案很有帮助,你可以点击答案左侧的勾号来接受它:我知道-在回答完成后接受有时间限制posted@Mulligan太好了,这很有帮助!如果你认为这个答案是有帮助的,你可以点击答案左边的勾号来接受它:我知道-在答案发布后接受有时间限制
# 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
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