我有一个描述性的辅助表,表中的行指定了变量的特征,其中varCat
描述了变量类别,rept
是该类别的后续实现重复次数,form
是它们的数据格式:
require(dplyr)
require(tidyr)
require(purrr)
descr <- tibble(
varCat = c("a", "b"),
rept = c(1, 3),
form = c("text", "num")
)
descr
#> # A tibble: 2 × 3
#> varCat rept form
#> <chr> <dbl> <chr>
#> 1 a 1 text
#> 2 b 3 num
我想获取的是以下(空) Dataframe :
d
#> # A tibble: 0 × 4
#> # … with 4 variables: a <chr>, b_1 <dbl>, b_2 <dbl>, b_3 <dbl>
创建于2022年9月27日,使用reprex v2.0.2
涉及两个步骤:
1.辅助表的var
和rept
一起建立“目标”数据框中的列名,使得如果rept
等于1,则不应应用后缀;然而,如果rept
大于1,则应当创建具有后缀的列序列;
1.每列的格式应读取descr$form
我已经设法实施了这些步骤,尽管我觉得相当笨拙:
# Step 1:
tmp <- descr %>%
uncount(rept, .id = "rept") %>%
group_by(varCat) %>%
mutate(
n = n(),
var = case_when(
n > 1 ~ paste0(varCat, "_", rept),
TRUE ~ varCat
)
) %>%
ungroup %>%
select(var, form)
c <- tmp$var
d <- matrix(ncol = length(c), nrow = 0) %>%
as_tibble(.name_repair = "unique") %>%
set_names(c)
# Step 2:
for (i in colnames(d)) {
for (j in seq_along(tmp$var)) {
if (tmp$var[j] == i & tmp$form[j] == "text") d[i] <- as.character(d[i]) else
if (tmp$var[j] == i & tmp$form[j] == "num") d[i] <- as.numeric(d[i])
}
}
d
#> # A tibble: 0 × 4
#> # … with 4 variables: a <chr>, b_1 <dbl>, b_2 <dbl>, b_3 <dbl>
创建于2022年9月27日,使用reprex v2.0.2
我相信一定有一个更简洁的方法来实现这一点。任何帮助将不胜感激。
3条答案
按热度按时间xesrikrc1#
将 mapply 与返回列表的自定义函数结合使用,然后使用call data.frame 将列表转换为 data.frame:
wz3gfoph2#
与@zx8754的答案类似,但也使用
a/b_1/b_2/b_3
命名:关键元素是
as.data.frame.list
,它允许通过col.names=
参数直接命名生成列类型的子集list()
。p1iqtdky3#
使用
purrr::pmap
和dplyr::bind_cols
的tidyverse
方法可能如下所示: