我已经使用了tidyverse很多,现在我对 Base R 的可能性很感兴趣。
让我们看一下这个简单的 data.frame
df <- data.frame(id = 1:4, nested = c("a, b, f", "c, d", "e", "e, f"))
Run Code Online (Sandbox Code Playgroud)
使用dplyr,stringr我们tidyr可以做
df %>%
mutate(nested = str_split(nested, ", ")) %>%
unnest(nested)
Run Code Online (Sandbox Code Playgroud)
得到(让我们忽略这tibble部分)
# A tibble: 8 x 2
id nested
<int> <chr>
1 1 a
2 1 b
3 1 f
4 2 c
5 2 d
6 3 e
7 4 e
8 4 f
Run Code Online (Sandbox Code Playgroud)
现在我们想使用基础 R 工具重建这个。所以
transform(df, nested = strsplit(nested, ", "))
Run Code Online (Sandbox Code Playgroud)
给出了使用mutate-part,但是我们如何使用unnest()这个data.frame?我想过使用unlist()但找不到令人满意的方法。
stack我们可以在named list一行中使用
with(df, setNames(stack(setNames(strsplit(nested, ","), id))[2:1], names(df)))
Run Code Online (Sandbox Code Playgroud)
-输出
id nested
1 1 a
2 1 b
3 1 f
4 2 c
5 2 d
6 3 e
7 4 e
8 4 f
Run Code Online (Sandbox Code Playgroud)
如果我们使用transform,则使用rep基于lengths列的list复制
out <- transform(df, nested = strsplit(nested, ", "))
data.frame(id = rep(out$id, lengths(out$nested)), nested = unlist(out$nested))
Run Code Online (Sandbox Code Playgroud)