根据列值复制数据框中的行
Duplicating rows in dataframe based on column value
我正在尝试根据列的值复制行。
我的数据框 (df) 目前看起来像:
Species name
Visits
Apis m
4
Bombus l
7
等等(还有 34 列都需要重复)我希望它看起来像:
Species name
Apis m
Apis m
Apis m
Apis m
Bombus l
Bombus l
Bombus l
Bombus l
Bombus l
Bombus l
Bombus l
这是一个相当大的数据集,已经有 1767 个观测值,有 190 个 'Species Name',每个都被访问了数百次。
我对 R(和编码!)还很陌生,所以一切都非常 'trial and error'。我在 Stack Overflow 上找到了一个解决方案
“splitstackshape”但出现错误
"Error in .subset2(x, i, exact = exact) : recursive indexing failed at level 2".
这是我的代码:
expandRows(df, df$Visits,
count.is.col = TRUE, drop = TRUE)
此错误的其他实例存在问题,但请注意与 'expand rows' 函数相关的问题。该列存储为整数,我已从 'Visits' 列中删除所有空值。
任何关于我的问题可能是什么的指示或关于如何做到这一点的其他想法将不胜感激。
丹妮尔
编辑:下面的 Reprex,我不确定 'could not find function' 与 运行 没有 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"
您可以尝试 tidyr/tidyverse 包中的 uncount
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
由 reprex package (v2.0.0)
于 2021-04-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)
输出:
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
我正在尝试根据列的值复制行。 我的数据框 (df) 目前看起来像:
Species name | Visits |
---|---|
Apis m | 4 |
Bombus l | 7 |
等等(还有 34 列都需要重复)我希望它看起来像:
Species name |
---|
Apis m |
Apis m |
Apis m |
Apis m |
Bombus l |
Bombus l |
Bombus l |
Bombus l |
Bombus l |
Bombus l |
Bombus l |
这是一个相当大的数据集,已经有 1767 个观测值,有 190 个 'Species Name',每个都被访问了数百次。
我对 R(和编码!)还很陌生,所以一切都非常 'trial and error'。我在 Stack Overflow 上找到了一个解决方案 “splitstackshape”但出现错误
"Error in .subset2(x, i, exact = exact) : recursive indexing failed at level 2".
这是我的代码:
expandRows(df, df$Visits,
count.is.col = TRUE, drop = TRUE)
此错误的其他实例存在问题,但请注意与 'expand rows' 函数相关的问题。该列存储为整数,我已从 'Visits' 列中删除所有空值。
任何关于我的问题可能是什么的指示或关于如何做到这一点的其他想法将不胜感激。
丹妮尔
编辑:下面的 Reprex,我不确定 'could not find function' 与 运行 没有 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"
您可以尝试 tidyr/tidyverse 包中的 uncount
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
由 reprex package (v2.0.0)
于 2021-04-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)
输出:
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