我在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我知道要拆分I,我需要这样做:id_split <- strsplit(dt$id,"&&")
但是,如何使用相同的val为最初放在一行中的in创建新行呢?
发布于 2020-05-08 12:26:33
您可以cbind拆分获得一个列,您可以再次cbind到val (回收)。
res <- do.call(rbind, Map(data.frame, id=lapply(strsplit(dat$id, "&&"), cbind),
val=dat$val))
res <- cbind(n=1:nrow(res), res)
res
# n id val
# 1 1 1 10
# 2 2 2 10
# 3 3 3 20
# 4 4 4 30
# 5 5 5 30发布于 2020-05-08 12:30:17
您可以使用来自lengths拆分的id并展开您的行。然后将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)))这给了,
n id val 1 1 1 10 1.1 2 2 10 2 3 3 20 3 4 4 30 3.1 5 5 30
可以使用rownames(res_df) <- NULL删除行名。
发布于 2020-05-08 12:37:14
如果有人想要找到整洁的解决方案,
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编辑:是由@sotos推荐的,我完全错过了。一种线性解
d %>% separate_rows(id, ,sep = "&&")提供相同的输出
# 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 30https://stackoverflow.com/questions/61678890
复制相似问题