如果我有桌子
ID C1 C2 C3 C4 C5
1
2 HD NS VM
3 DH FV
4 HD DH
现在我必须将其转换为下表
ID C
2 HD
2 NS
2 VM
3 DH
3 FV
4 HD
4 DH
在R中进行此转换的最佳方法是什么?这必须在R中完成,作为更大代码的一部分吗?
答案 0 :(得分:1)
我们可以使用C:\
和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
答案 1 :(得分:1)
使用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
答案 2 :(得分:1)
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)))
您可以使用取消列表,但要获得该ID,您之前创建的数据矩阵与您的数据相同,只需使用IDS
plouf = matrix(data$ID,dim(data)[1],dim(data)[2]-1)
data$ID <- NULL
然后使用取消列表并选择非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