使用分隔符将数据框从宽转换为长(多个变量)[重复]

问题描述 投票:0回答:1

我有一个这样的df:

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 但我无法让它工作后,我就卡住了。不知道是不是分隔符的问题

非常感谢您的帮助

r dplyr tidyverse reshape reshape2
1个回答
4
投票

我们可以将

pivot_longer
names_sep
参数一起使用。诀窍是使用
names_to
c(".value", "num")

.value

 中的 
names_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
© www.soinside.com 2019 - 2024. All rights reserved.