转置数据框并使用第一列作为索引
Transposing a dataframe and using the first column as an index
我有一个结构如下的数据框,其中 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)
而且我希望将其转置,以便波长为 header 并且治疗是每次重复文件名的行:
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/cast
、data.table
包中的 melt
、gather/spread
、t
- 尽我所能考虑到。最终的实际数据框将大约为 500 行乘以 3500 列 - 因此我不希望调用任何特定的列或方法名称。我的问题似乎主要是我不能在一个值下调用所有方法列并用它来融化:
colMethods <- myData[, 2:length(myData)]
很多时候我没有收到错误,但数据帧 R returns 只是一个波长列表和一个显示 'wavelength' 的列。你们将如何处理这个问题?谢谢!
你可以试试这个:
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
这是 data.table
使用 melt
和 dcast
的替代方法:
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
我有一个结构如下的数据框,其中 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)
而且我希望将其转置,以便波长为 header 并且治疗是每次重复文件名的行:
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/cast
、data.table
包中的 melt
、gather/spread
、t
- 尽我所能考虑到。最终的实际数据框将大约为 500 行乘以 3500 列 - 因此我不希望调用任何特定的列或方法名称。我的问题似乎主要是我不能在一个值下调用所有方法列并用它来融化:
colMethods <- myData[, 2:length(myData)]
很多时候我没有收到错误,但数据帧 R returns 只是一个波长列表和一个显示 'wavelength' 的列。你们将如何处理这个问题?谢谢!
你可以试试这个:
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
这是 data.table
使用 melt
和 dcast
的替代方法:
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