R:将不完全矩阵转换为两列或三列
R: Convert an incomplete matrix to two or three columns
如果我有 table
ID C1 C2 C3 C4 C5
1
2 HD NS VM
3 DH FV
4 HD DH
现在我必须把它转换成下面的形式table
ID C
2 HD
2 NS
2 VM
3 DH
3 FV
4 HD
4 DH
在 R 中进行这种转换的最佳方法是什么?这必须作为更大代码的一部分在 R 中完成吗?
我们可以使用dplyr
和tidyr
。
library(dplyr)
library(tidyr)
dt2 <- dt %>%
gather(C, Value, -ID, na.rm = TRUE) %>%
select(-C) %>%
arrange(ID)
dt2
ID Value
1 2 HD
2 2 NS
3 2 VM
4 3 DH
5 3 FV
6 4 HD
7 4 DH
数据
dt <- read.table(text = "ID C1 C2 C3 C4 C5
1 NA NA NA NA NA
2 HD NS VM NA NA
3 NA NA NA DH FV
4 HD NA NA DH NA ",
header = TRUE, stringsAsFactors = FALSE)
使用melt
library(reshape)
na.omit(melt(dt,id.var='ID'))
ID variable value
2 2 C1 HD
4 4 C1 HD
6 2 C2 NS
10 2 C3 VM
15 3 C4 DH
16 4 C4 DH
19 3 C5 FV
data <- as.data.frame(list(ID = c(1,2,3,4),
C1 = c(NA,"HD",NA,"HD"),C2 = c(NA,"NS",NA,NA),C3 = c(NA,"VM",NA,NA),C4 = c(NA,NA,"DH","DH"), C5 = c(NA,NA,"FV",NA)))
您可以使用 unlist,但要获得 ID,您之前需要创建一个与数据大小相同的矩阵,只需使用 IDS
plouf = matrix(data$ID,dim(data)[1],dim(data)[2]-1)
data$ID <- NULL
然后使用 unlist 和 select 非 NA 数据:
result = as.data.frame(list(
C = unlist(data)[!is.na(unlist(data,use.names = FALSE))],
ID = unlist(plouf)[!is.na(unlist(data))] ))
导致:
C ID
C12 HD 2
C14 HD 4
C22 NS 2
C32 VM 2
C43 DH 3
C44 DH 4
C53 FV 3
如果我有 table
ID C1 C2 C3 C4 C5
1
2 HD NS VM
3 DH FV
4 HD DH
现在我必须把它转换成下面的形式table
ID C
2 HD
2 NS
2 VM
3 DH
3 FV
4 HD
4 DH
在 R 中进行这种转换的最佳方法是什么?这必须作为更大代码的一部分在 R 中完成吗?
我们可以使用dplyr
和tidyr
。
library(dplyr)
library(tidyr)
dt2 <- dt %>%
gather(C, Value, -ID, na.rm = TRUE) %>%
select(-C) %>%
arrange(ID)
dt2
ID Value
1 2 HD
2 2 NS
3 2 VM
4 3 DH
5 3 FV
6 4 HD
7 4 DH
数据
dt <- read.table(text = "ID C1 C2 C3 C4 C5
1 NA NA NA NA NA
2 HD NS VM NA NA
3 NA NA NA DH FV
4 HD NA NA DH NA ",
header = TRUE, stringsAsFactors = FALSE)
使用melt
library(reshape)
na.omit(melt(dt,id.var='ID'))
ID variable value
2 2 C1 HD
4 4 C1 HD
6 2 C2 NS
10 2 C3 VM
15 3 C4 DH
16 4 C4 DH
19 3 C5 FV
data <- as.data.frame(list(ID = c(1,2,3,4),
C1 = c(NA,"HD",NA,"HD"),C2 = c(NA,"NS",NA,NA),C3 = c(NA,"VM",NA,NA),C4 = c(NA,NA,"DH","DH"), C5 = c(NA,NA,"FV",NA)))
您可以使用 unlist,但要获得 ID,您之前需要创建一个与数据大小相同的矩阵,只需使用 IDS
plouf = matrix(data$ID,dim(data)[1],dim(data)[2]-1)
data$ID <- NULL
然后使用 unlist 和 select 非 NA 数据:
result = as.data.frame(list(
C = unlist(data)[!is.na(unlist(data,use.names = FALSE))],
ID = unlist(plouf)[!is.na(unlist(data))] ))
导致:
C ID
C12 HD 2
C14 HD 4
C22 NS 2
C32 VM 2
C43 DH 3
C44 DH 4
C53 FV 3