在R数据表中从一行中拆分和创建两行

在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,我需要执行以

我在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,我需要执行以下操作:
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)
。但是,您需要围绕其他列进行操作。

A
data.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
by
id
from
data.table
可以完成这项工作

库(data.table)

df
tstrplit
by
id
from
数据。表可以完成这项工作

库(data.table)

如果您还可以执行
dt%>%分隔行(id,sep='&&')
您还可以执行
dt%>%分隔行(id,sep='&')