将数据从宽数据转换为长数据,其中 'lengths(varying)' > 'length(times)'
Transforming data from wide to long where 'lengths(varying)' > 'length(times)'
我正在尝试将数据从 df 转换为 df2。
> df
part.id bl.rbc bl.serum bl.hp bl.epfa sm.rbc sm.serum sm.hp sm.epfa oy.rbc oy.serum oy.hp
1 1 NA NA NA NA NA NA NA NA NA NA NA
2 2 NA NA NA NA NA NA NA NA NA NA NA
3 3 NA NA NA NA NA NA NA NA NA NA NA
oy.epfa
1 NA
2 NA
3 NA
> df2
part.id timepoint rbc serum hp epfa
1 1 bl NA NA NA NA
2 2 sm NA NA NA NA
3 3 oy NA NA NA NA
我试过 reshape 但如果 lengths(varying) = 4 > length(time) = 3 我会得到一个错误。我的实际情况涉及 16 varying。
创建这些的代码:
part.id <- c(1,2,3)
bl.rbc <- NA
bl.serum <- NA
bl.hp <- NA
bl.epfa <- NA
sm.rbc <- NA
sm.serum <- NA
sm.hp <- NA
sm.epfa <- NA
oy.rbc <- NA
oy.serum <- NA
oy.hp <- NA
oy.epfa <- NA
df <- data.frame(part.id,
bl.rbc, bl.serum, bl.hp, bl.epfa,
sm.rbc, sm.serum, sm.hp, sm.epfa,
oy.rbc, oy.serum, oy.hp, oy.epfa)
timepoint <- c("bl", "sm", "oy")
rbc <- NA
serum <- NA
hp <- NA
epfa <- NA
df2 <- data.frame(part.id, timepoint, rbc, serum, hp, epfa)
这与您的预期输出不符,但也许是您想要的?
library(tidyverse)
library(stringr)
df %>%
rename_at(-1, ~ str_replace(., "(\w+).(\w+)", "\2_\1")) %>%
pivot_longer(-part.id, names_to = c(".value", "timepoint"), names_sep='_')
# A tibble: 9 x 6
part.id timepoint rbc serum hp epfa
<dbl> <chr> <lgl> <lgl> <lgl> <lgl>
1 1 bl NA NA NA NA
2 1 sm NA NA NA NA
3 1 oy NA NA NA NA
4 2 bl NA NA NA NA
5 2 sm NA NA NA NA
6 2 oy NA NA NA NA
7 3 bl NA NA NA NA
8 3 sm NA NA NA NA
9 3 oy NA NA NA NA
我正在尝试将数据从 df 转换为 df2。
> df
part.id bl.rbc bl.serum bl.hp bl.epfa sm.rbc sm.serum sm.hp sm.epfa oy.rbc oy.serum oy.hp
1 1 NA NA NA NA NA NA NA NA NA NA NA
2 2 NA NA NA NA NA NA NA NA NA NA NA
3 3 NA NA NA NA NA NA NA NA NA NA NA
oy.epfa
1 NA
2 NA
3 NA
> df2
part.id timepoint rbc serum hp epfa
1 1 bl NA NA NA NA
2 2 sm NA NA NA NA
3 3 oy NA NA NA NA
我试过 reshape 但如果 lengths(varying) = 4 > length(time) = 3 我会得到一个错误。我的实际情况涉及 16 varying。
创建这些的代码:
part.id <- c(1,2,3)
bl.rbc <- NA
bl.serum <- NA
bl.hp <- NA
bl.epfa <- NA
sm.rbc <- NA
sm.serum <- NA
sm.hp <- NA
sm.epfa <- NA
oy.rbc <- NA
oy.serum <- NA
oy.hp <- NA
oy.epfa <- NA
df <- data.frame(part.id,
bl.rbc, bl.serum, bl.hp, bl.epfa,
sm.rbc, sm.serum, sm.hp, sm.epfa,
oy.rbc, oy.serum, oy.hp, oy.epfa)
timepoint <- c("bl", "sm", "oy")
rbc <- NA
serum <- NA
hp <- NA
epfa <- NA
df2 <- data.frame(part.id, timepoint, rbc, serum, hp, epfa)
这与您的预期输出不符,但也许是您想要的?
library(tidyverse)
library(stringr)
df %>%
rename_at(-1, ~ str_replace(., "(\w+).(\w+)", "\2_\1")) %>%
pivot_longer(-part.id, names_to = c(".value", "timepoint"), names_sep='_')
# A tibble: 9 x 6
part.id timepoint rbc serum hp epfa
<dbl> <chr> <lgl> <lgl> <lgl> <lgl>
1 1 bl NA NA NA NA
2 1 sm NA NA NA NA
3 1 oy NA NA NA NA
4 2 bl NA NA NA NA
5 2 sm NA NA NA NA
6 2 oy NA NA NA NA
7 3 bl NA NA NA NA
8 3 sm NA NA NA NA
9 3 oy NA NA NA NA