2

我正在尝试根据列的值复制行。我的数据框(df)目前看起来像:

物种名称 访问
蜜蜂 4
熊蜂l 7

依此类推(还有 34 列需要重复)我希望它看起来像:

物种名称
蜜蜂
蜜蜂
蜜蜂
蜜蜂
熊蜂l
熊蜂l
熊蜂l
熊蜂l
熊蜂l
熊蜂l
熊蜂l

这是一个相当大的数据集,包含 1767 个观测值,有 190 个“物种名称”,每个物种都被访问了数百次。

我对 R(和编码!)非常陌生,所以一切都是“反复试验”。我使用“splitstackshape”在 Stack Overflow 上找到了一个解决方案,但出现了错误

“.subset2(x, i, exact = exact) 中的错误:递归索引在第 2 级失败”。

这是我的代码:

expandRows(df, df$Visits, 
           count.is.col = TRUE, drop = TRUE)

此错误的其他实例存在问题,但请注意与“扩展行”功能相关。该列存储为整数,我已从“访问”列中删除了所有空值。

任何关于我的问题可能是什么或如何做到这一点的其他想法的指针将不胜感激。

丹妮尔

编辑:下面的 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"
4

2 回答 2

1

您可以uncount从 tidyr/tidyverse 包中尝试

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 包于 2021-04-25 创建 (v2.0.0 )

于 2021-04-25T14:54:04.593 回答
1

更新(uncount如前所述):

使用您的代码:

df.expanded <- df[rep(row.names(df), df$Visits), 1:2]

或者:您可以使用slicewithseq_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    
于 2021-04-25T15:11:00.053 回答