我有一个这样的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 但我无法让它工作后,我就卡住了。不知道是不是分隔符的问题
非常感谢您的帮助
我们可以将
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