Может быть, вы можете попробовать reshape
, как показано ниже
dfout <- setNames(reshape(df,
direction = "long",
idvar = "ID",
varying = list(grep("^PC",names(df))))[-2],
c("ID","PC"))
dfout <- `row.names<-`(subset(dfout[order(dfout$ID),],!is.na(PC)),NULL)
, чтобы
> dfout
ID PC
1 5 8970
2 5 864
3 6 2800
4 6 2812
5 6 2801
6 6 284
ДАННЫЕ
df <- structure(list(ID = 5:6, PC1 = c(8970L, 2800L), PC2 = c(864L,
2812L), PC3 = c(NA, 2801L), PC4 = c(NA, 284L)), class = "data.frame", row.names = c(NA,
-2L))