R语言 根据计数向数据框添加行

cbjzeqam  于 2023-01-18  发布在  其他
关注(0)|答案(3)|浏览(158)

我有一个数据框,看起来像这样:
| 种属_ID|位置_ID|海拔高度|女性|男性|
| - ------|- ------|- ------|- ------|- ------|
| 蒙|白度|小行星1700|三个|十个|
| 乔恩|中频|一八五零年|五个|第二章|
| 森林|工作站|小行星2100|七|三个|
| 特尔|甲基溴|小行星1700|二十个|十五|
1.我想有一个总人数的个人(女性和男性)作为一个额外的列
1.我想根据个体总数在数据框中添加行,每行包含列的所有信息。例如,对于Species_ID“mon”,我们总共有13个个体。因此,我想额外添加13行,包含“Species_ID”,“Location_ID”和“Altitude”的所有信息
我很确定我可以通过使用mutate()来处理第一个问题,但是我完全不知道如何解决第二个步骤。

7qhs6swi

7qhs6swi1#

您可以使用tidyr中的uncount。可选参数.id创建一个新变量,为每个创建的行提供唯一标识符。

library(tidyr)

df %>%
  uncount(Female + Male, .id = "ID")

#    Species_ID Location_ID Altitude Female Male ID
# 1         mon          WH     1700      3   10  1
# 2         mon          WH     1700      3   10  2
# 3         mon          WH     1700      3   10  3
# 4         mon          WH     1700      3   10  4
# 5         mon          WH     1700      3   10  5
# 6         mon          WH     1700      3   10  6
# 7         mon          WH     1700      3   10  7
# 8         mon          WH     1700      3   10  8
# 9         mon          WH     1700      3   10  9
# 10        mon          WH     1700      3   10 10
# 11        mon          WH     1700      3   10 11
# 12        mon          WH     1700      3   10 12
# 13        mon          WH     1700      3   10 13
# ...
数据
df <- structure(
  list(Species_ID = c("mon", "jon", "sylv", "ter"),
       Location_ID = c("WH", "IF", "WS", "MB"),
       Altitude = c(1700L, 1850L, 2100L, 1700L), 
       Female = c(3L, 5L, 7L, 20L),
       Male = c(10L, 2L, 3L, 15L)),
  class = "data.frame", row.names = c(NA, -4L))
6rqinv9w

6rqinv9w2#

这是你要找的吗

library(dplyr)
d <- tibble::tribble(
  ~Species_ID,  ~Location_ID,   ~Altitude,  ~Female,    ~Male, 
"mon",  "WH",   1700,   3,  10,
"jon",  "IF",   1850,   5,  2,
"sylv", "WS",   2100,   7,  3,
"ter",  "MB",   1700,   20, 15)

d <- d %>% 
  mutate(all_obs = Female + Male)

d[rep(1:nrow(d), d$all_obs), 1:3]
#> # A tibble: 65 × 3
#>    Species_ID Location_ID Altitude
#>    <chr>      <chr>          <dbl>
#>  1 mon        WH              1700
#>  2 mon        WH              1700
#>  3 mon        WH              1700
#>  4 mon        WH              1700
#>  5 mon        WH              1700
#>  6 mon        WH              1700
#>  7 mon        WH              1700
#>  8 mon        WH              1700
#>  9 mon        WH              1700
#> 10 mon        WH              1700
#> # … with 55 more rows

reprex package(v2.0.1)于2023年1月17日创建

ca1c2owp

ca1c2owp3#

好吧,我是这样解决的:

b2 <- b1 %>% 
rowwise() %>% 
mutate(all_obs = sum(Weibchen,Arbeiterinnen,Männchen, na.rm=TRUE))
 %>% 
dplyr::select(Taxon_ID, Standort, Höhenstufe, all_obs)

b3 <- uncount(b2, all_obs, .remove=TRUE, .id="ID")

相关问题