在R数据表中从一行中拆分和创建两行
我在R中有这样一个数据集(dt):在R数据表中从一行中拆分和创建两行,r,datatable,R,Datatable,我在R中有这样一个数据集(dt): n id val 1 1&&2 10 2 3 20 3 4&&5 30 我想得到的是 n id val 1 1 10 2 2 10 3 3 20 4 4 30 5 5 30 我知道要拆分ID,我需要执行以
n id val
1 1&&2 10
2 3 20
3 4&&5 30
我想得到的是
n id val
1 1 10
2 2 10
3 3 20
4 4 30
5 5 30
我知道要拆分ID,我需要执行以下操作:
id\u split您可以cbind
拆分以获得一列,您可以将该列cbind
再次拆分到val
(循环)
res您可以将cbind
拆分得到一列,您可以将该列cbind
再次拆分为val
(循环)
res您可以使用id
拆分中的length
并展开行。然后将n
设置为数据帧长度的顺序,即
l1 <- strsplit(as.character(df$id), '&&')
res_df <- transform(df[rep(seq_len(nrow(df)), lengths(l1)),],
id = unlist(l1),
n = seq_along(unlist(l1)))
您可以使用rownames(res_df)删除行名。您可以使用id
拆分中的length
并展开行。然后将n
设置为数据帧长度的顺序,即
l1 <- strsplit(as.character(df$id), '&&')
res_df <- transform(df[rep(seq_len(nrow(df)), lengths(l1)),],
id = unlist(l1),
n = seq_along(unlist(l1)))
如果有人需要整洁的解决方案,可以使用行名(res_df)删除行名
dt %>%
separate(id, into = paste0("id", 1:2),sep = "&&") %>%
pivot_longer(cols = c(id1,id2), names_to = "id_name", values_to = "id") %>%
drop_na(id) %>%
select(n, id, val)
输出为
# A tibble: 5 x 3
n id val
<dbl> <chr> <dbl>
1 1 1 10
2 1 2 10
3 2 3 20
4 3 4 30
5 3 5 30
提供与相同的输出
# A tibble: 5 x 3
n id val
<dbl> <chr> <dbl>
1 1 1 10
2 1 2 10
3 2 3 20
4 3 4 30
5 3 5 30
#一个tible:5 x 3
n id val
1 1 1 10
2 1 2 10
3 2 3 20
4 3 4 30
5 3 5 30
如果有人在寻找整洁的解决方案
dt %>%
separate(id, into = paste0("id", 1:2),sep = "&&") %>%
pivot_longer(cols = c(id1,id2), names_to = "id_name", values_to = "id") %>%
drop_na(id) %>%
select(n, id, val)
输出为
# A tibble: 5 x 3
n id val
<dbl> <chr> <dbl>
1 1 1 10
2 1 2 10
3 2 3 20
4 3 4 30
5 3 5 30
提供与相同的输出
# A tibble: 5 x 3
n id val
<dbl> <chr> <dbl>
1 1 1 10
2 1 2 10
3 2 3 20
4 3 4 30
5 3 5 30
#一个tible:5 x 3
n id val
1 1 1 10
2 1 2 10
3 2 3 20
4 3 4 30
5 3 5 30
A数据表
解决方案
库(data.table)
DT n val id
#> 1: 1 10 1
#> 2: 2 10 2
#> 3: 3 20 3
#> 4: 4 30 4
#> 5: 5 30 5
由(v0.3.0)于2020年5月8日创建
注意:
一种更为有效的解决方案是by=1:nrow(DT)
。但是,您需要围绕其他列进行操作。Adata.table
solution
库(data.table)
DT n val id
#> 1: 1 10 1
#> 2: 2 10 2
#> 3: 3 20 3
#> 4: 4 30 4
#> 5: 5 30 5
由(v0.3.0)于2020年5月8日创建
注意:
一种更为有效的解决方案是by=1:nrow(DT)
。但是,您需要在其他栏目中发挥作用。tstrplit
byid
fromdata.table
可以完成这项工作
库(data.table)
dftstrplit
byid
from数据。表可以完成这项工作
库(data.table)
如果您还可以执行dt%>%分隔行(id,sep='&&')
您还可以执行dt%>%分隔行(id,sep='&')