使用分隔符将数据框从宽格式转换为长格式(多个变量)。

4

我有一个像这样的数据框:

FID <- c(1,2,3,4)
d <- c(1,1,2,2)
IID_1 <- c("1A","2A","NA","4A")
IID_2 <- c("1B","2B","3B","4B")
PS_1 <- c(0.5,0.8, NA, 0.3)
PS_2 <- c(0.3,0.4, 0.1, 0.4)
EA_1 <- c(0.2,0.8, NA, 0.3)
EA_2 <- c(0.5,0.5, 0.1, 0.2)

df <- data.frame (FID,d,IID_1,IID_2, PS_1, PS_2, EA_1, EA_2)

我需要将它转换为长格式,就像这个:

FID <- c(1,1,2,2,3,3,4,4)
d <- c(1,1,1,1,2,2,2,2)
IID <- c("1A","1B", "2A", "2B","NA","3B", "4A", "4B")

PS <- c(0.5,0.3, 0.8,0.4, NA,0.1, 0.3, 0.4)

EA <- c(0.2,0.5,0.8,0.5 ,NA,0.1, 0.3,0.2)


df2 <- data.frame (FID,d,IID, PS, EA)

我卡住了,因为我尝试使用pivot_longer,但无法使其正常工作。我不知道是不是因为分隔符的原因。

非常感谢您的帮助。

1个回答

4

我们可以使用带有names_sep参数的pivot_longer。关键在于使用c(".value", "num")作为names_to的值。

.valuenames_to中强制R使用原始列中的值作为新列的名称。在这里,我们将.value放在第一位 -> 所以新变量将被称为PS、EA和IID,_后面的部分将被称为num。在我们的代码中,我们删除了num

library(dplyr)
library(tidyr)

df %>%
  pivot_longer(cols = -c(FID, d), 
               names_to = c(".value", "num"),
               names_sep = "_") %>%
  select(-num)

    FID     d IID      PS    EA
  <dbl> <dbl> <chr> <dbl> <dbl>
1     1     1 1A      0.5   0.2
2     1     1 1B      0.3   0.5
3     2     1 2A      0.8   0.8
4     2     1 2B      0.4   0.5
5     3     2 NA     NA    NA  
6     3     2 3B      0.1   0.1
7     4     2 4A      0.3   0.3
8     4     2 4B      0.4   0.2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接