引用多列和多行以计算新列中的新值

Referencing multiple columns and rows to calculate new value in a new column

提问人:Crippycajes 提问时间:7/6/2023 最后编辑:PhilCrippycajes 更新时间:7/6/2023 访问量:41

问:

这是我的 data.frame {sf}。我将其转换为长格式,因此 UID 表示多边形。在每个 UID 中,存在 0 到 3 个物种。每个 UID 的总和百分比将为 100 或 0。

用户界面 次序 物种 百分之 几何学
1 1 一个 80 等等
1 2 BL系列 15 等等
1 3 P 5 等等
2 1 S 75 等等
2 2 E 25 等等
2 3 0 等等
3 1 PA系列 61 等等
3 2 39 等等
3 3 0 等等
4 1 0 等等
4 2 0 等等
4 3 0 等等

我想在新列“ZONE”中创建一个新条目,其中包含以下值:

  • 如果每个唯一的 UID 不包含物种的 A 或 AT,则在 ZONE 中输入“Misc.”。
  • 如果唯一 UID 的所有物种值均为 na,则在 Zone 中输入 na
  • 如果 UID 包含 A 或 AT,并且 A 或 AT 的下一个单元格中的百分比为 >= 80,则输入“For”。如果 <80 输入“Gra”

这是我的尝试:

list < - c("A", "AT")
data.frame$ZONE <- (data.frame$SPECIES %in% list)
data.frame$ZONE[data.frame$ZONE == TRUE] <- "For"
data.frame$ZONE[is.na(data.frame$SPECIES)] <- NA
data.frame$ZONE[data.frame$ZONE == FALSE] <- "Misc."

这导致每一行都被视为一个个体,而不是按宫内节育器分组。另外,我完全忽略了>=80或<。

我希望它看起来像这样:

用户界面 次序 物种 百分之 几何学
1 1 一个 80 等等
1 2 BL系列 15 等等
1 3 P 5 等等
2 1 S 75 杂项。 等等
2 2 E 25 杂项。 等等
2 3 0 杂项。 等等
3 1 PA系列 61 格拉 等等
3 2 39 格拉 等等
3 3 0 格拉 等等
4 1 0 等等
4 2 0 等等
4 3 0 等等

感谢您的帮助。

r 操作 数据 整理

评论


答:

1赞 jkatam 7/6/2023 #1

请尝试以下代码

sf %>% group_by(UID) %>% 
  mutate(zone1=ifelse(any(SPECIES %in% c('A','AT')), 'Misc.', NA),
    zone2=ifelse(all(SPECIES %in% c('na')), 'na', NA),
    zone3=ifelse(any(SPECIES %in% c('A','AT') & PERCENT>=80), 'For',NA),
    zone4=ifelse(any(SPECIES %in% c('A','AT') & PERCENT<80), 'Gra',NA),
    zone=ifelse(is.na(coalesce(zone3,zone4,zone2,zone1)),'Misc.',coalesce(zone3,zone4,zone2,zone1))) %>% 
  select(-c(zone1:zone4))

创建于 2023-07-05 使用 reprex v2.0.2

# A tibble: 12 × 6
# Groups:   UID [4]
     UID ORDER SPECIES PERCENT geometry zone 
   <dbl> <dbl> <chr>     <dbl> <chr>    <chr>
 1     1     1 A            80 blahblah For  
 2     1     2 BL           15 blahblah For  
 3     1     3 P             5 blahblah For  
 4     2     1 S            75 blahblah Misc.
 5     2     2 E            25 blahblah Misc.
 6     2     3 na            0 blahblah Misc.
 7     3     1 PA           61 blahblah Gra  
 8     3     2 AT           39 blahblah Gra  
 9     3     3 na            0 blahblah Gra  
10     4     1 na            0 blahblah na   
11     4     2 na            0 blahblah na   
12     4     3 na            0 blahblah na   

评论

1赞 Crippycajes 7/6/2023
谢谢,对于更大、更复杂的数据集来说,这确实是很好的指导
0赞 jkatam 7/6/2023
谢谢,你能把它当作一个答案吗