我正在尝试将下面的列表转换为数据格式。
我试过熔化/浇铸、铸造、取消列表等,但似乎无法达到预期的产量。
事先非常感谢!
df <- list(
name=rep(c(11,12), each=1),
value=rnorm(2),
name=rep(c(13,14), each=1),
value=rnorm(2)
)
df我希望在dataframe中获得以下输出:
name value
11 1.187
12 0.691
13 0.452
14 0.898发布于 2019-09-05 19:18:34
一个选项是将stack设置为两列data.frame,并将其spread回“wide”格式。
library(tidyverse)
enframe(df) %>%
unnest(value) %>%
group_by(name) %>%
mutate(rn = row_number()) %>%
spread(name, value) %>%
select(-rn)
# A tibble: 4 x 2
# name value
# <dbl> <dbl>
#1 11 -0.484
#2 12 -0.110
#3 13 -0.328
#4 14 0.0737或者另一种选择是使用来自开发版本的pivot_longer tidyr。
df %>%
set_names(str_c(names(.), "_", cumsum(names(.) == "name"))) %>%
as_tibble %>%
mutate(rn = row_number()) %>%
pivot_longer(-rn, names_to =c(".value", "group"), names_sep = '_') %>%
select(name, value)或者使用base R
reshape(transform(stack(df), rn = ave(seq_along(ind), ind,
FUN = seq_along)), idvar = 'rn', direction = 'wide', timevar = 'ind')发布于 2019-09-05 19:28:45
这里有一个使用split的R基的方法-
data.frame(
split(v <- unlist(df), sub("[0-9]+", "", names(v)))
)
name value
1 11 -0.2282623
2 12 -0.8101849
3 13 -0.9311898
4 14 0.3638835数据-
df <- structure(list(name = c(11, 12), value = c(-0.22826229127103,
-0.810184913338659), name = c(13, 14), value = c(-0.931189778412408,
0.363883463286674)), .Names = c("name", "value", "name", "value"
))发布于 2019-09-05 19:39:53
d <- data.frame(
name = unlist(df[names(df) == "name"]),
value = unlist(df[names(df) == "value"])
)https://stackoverflow.com/questions/57811760
复制相似问题