【问题标题】:Transposing a dataframe and using the first column as an index转置数据框并使用第一列作为索引
【发布时间】:2020-08-13 08:30:06
【问题描述】:

我有一个如下结构的数据框,其中 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)

我已经尝试过 reshape2 中的 melt/castdata.table 包中的 meltgather/spreadt - 我能想到的一切。最后的实际数据框将是大约 500 行 x 3500 列 - 所以我不希望调用任何特定的列或方法名称。我的问题似乎主要是我不能在一个值下调用所有方法列并使用它来融化:

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

很多时候我没有收到错误,但 R 返回的数据帧只是波长列表和显示“波长”的列。你们中的任何人会如何处理这个问题?谢谢!

【问题讨论】:

  • @MrFlick 谢谢!效果很好!

标签: r transpose melt


【解决方案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))

代码:

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

【讨论】:

  • @Mulligan 太棒了!如果您认为此答案有帮助,您可以通过单击答案左侧的勾号来接受它:)
  • 我知道 - 发布答案后有时间限制接受
【解决方案2】:

这里是 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-23
    • 2017-07-04
    • 1970-01-01
    • 1970-01-01
    • 2014-10-05
    • 2018-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多