[英]Duplicating rows in dataframe based on column value
我正在尝试根据列的值复制行。 我的 dataframe (df) 目前看起来像:
物种名称 | 访问 |
---|---|
蜜蜂 | 4 |
熊蜂l | 7 |
依此类推(还有 34 列需要重复)我希望它看起来像:
物种名称 |
---|
蜜蜂 |
蜜蜂 |
蜜蜂 |
蜜蜂 |
熊蜂l |
熊蜂l |
熊蜂l |
熊蜂l |
熊蜂l |
熊蜂l |
熊蜂l |
这是一个相当大的数据集,包含 1767 个观测值,有 190 个“物种名称”,每个物种都被访问了数百次。
我对 R (和编码)非常陌生,所以一切都是“反复试验”。 我使用“splitstackshape”在 Stack Overflow 上找到了一个解决方案,但出现了错误
“子集 2 中的错误(x,i,精确 = 精确):递归索引在 2 级失败”。
这是我的代码:
expandRows(df, df$Visits,
count.is.col = TRUE, drop = TRUE)
此错误的其他实例存在问题,但请注意与“扩展行”function 相关。 该列存储为 integer 并且我已从“访问”列中删除任何 null 值。
任何关于我的问题可能是什么或如何做到这一点的其他想法的指针将不胜感激。
丹妮尔
编辑:下面的 Reprex,我不确定“找不到函数”与什么相关,因为它似乎在没有 Reprex 的情况下运行代码? 另外,这里不包含实际的列名和 df,我在上面的示例中进行了简化。
expandRows(BombusL, BombusL$No.of.Interaction.Records, count.is.col = TRUE,
drop = TRUE)
#> Error in expandRows(BombusL, BombusL$No.of.Interaction.Records, count.is.col = TRUE, : could not find function "expandRows"
您可以尝试从uncount
/tidyverse package
library(tidyr)
data <- data.frame(Species = c("Apis m","Nimbus"),Visits = c(4,7))
data %>%
uncount(Visits)
#> Species
#> 1 Apis m
#> 1.1 Apis m
#> 1.2 Apis m
#> 1.3 Apis m
#> 2 Nimbus
#> 2.1 Nimbus
#> 2.2 Nimbus
#> 2.3 Nimbus
#> 2.4 Nimbus
#> 2.5 Nimbus
#> 2.6 Nimbus
由代表 package (v2.0.0) 于 2021 年 4 月 25 日创建
更新(因为uncount
已经提到):
使用您的代码:
df.expanded <- df[rep(row.names(df), df$Visits), 1:2]
或者:你可以使用slice
和seq_len(n())
library(dplyr)
df %>%
slice(rep(seq_len(n()), Visits)) %>%
select(-Visits)
Output:
Species.name
<chr>
1 Apis m
2 Apis m
3 Apis m
4 Apis m
5 Bombus l
6 Bombus l
7 Bombus l
8 Bombus l
9 Bombus l
10 Bombus l
11 Bombus l
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.