Транспонировать столбцы в строки на основе уникального идентификатора в R - PullRequest
2 голосов
/ 03 апреля 2020

Мои данные в настоящее время отформатированы следующим образом:

    ID  PC1     PC2     PC3     PC4
    5   8970    864     
    6   2800    2812    2801    284

Мне нужна отдельная строка для каждой точки данных, связанная с уникальным идентификатором, чтобы:

    ID  PC
    5   8970
    5   864
    6   2800
    6   2812
    6   2801
    6   284

Я понимаю, что это очень простой c вопрос, но при поиске похожих вопросов я могу найти только способы сделать это наоборот!

Спасибо

Ответы [ 3 ]

0 голосов
/ 03 апреля 2020

Лучше заполнить пробелы NA's, вы можете сделать это легко:

library(dplyr)
df <- df %>% mutate_all(na_if,"")

Мое наивное решение, но ясное:

library(reshape)
Input = (
  'ID  PC1     PC2     PC3     PC4
5   8970    864     NA     NA    
6   2800    2812    2801    284')
df = read.table(textConnection(Input), header = T)
df
res <- melt(df,id='ID')
res$variable <- NULL
res <- res[complete.cases(res),]
res <- res[order(res$ID),]
colnames(res)[2] <- 'PC'
res
  ID   PC
1  5 8970
3  5  864
2  6 2800
4  6 2812
6  6 2801
8  6  284
0 голосов
/ 03 апреля 2020

Может быть, вы можете попробовать 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))
0 голосов
/ 03 апреля 2020

library(dplyr)
library(tidyr)

df <- data.frame(
  ID = c(5,6), 
  PC1 = c(8970, 2800), 
  PC2 = c(864, 2812), 
  PC3 = c(NA, 2801), 
  PC4 = c(NA, 284)
)



df %>% 
  tidyr::pivot_longer(-ID, names_to = "PC_code", values_to = "value") %>% 
  dplyr::filter(!is.na(value)) %>% 
  dplyr::select(-PC_code)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...