R 不同行上的条件求和时的情况
我想根据某些作物的种植年限,在不同的地点(SiteID)定义不同的作物序列(CS)R 不同行上的条件求和时的情况,r,dplyr,R,Dplyr,我想根据某些作物的种植年限,在不同的地点(SiteID)定义不同的作物序列(CS) Crop = data.frame(SiteID=c('A','A','A','B','C','C','D','D'), Crop = c('soya','corn','wheat','corn','corn','soya','soya','wheat'), Years = c(2,2,1,5,3,2,2,3)) 到目前为止,我在单一作物和年份条件
Crop = data.frame(SiteID=c('A','A','A','B','C','C','D','D'),
Crop = c('soya','corn','wheat','corn','corn','soya','soya','wheat'),
Years = c(2,2,1,5,3,2,2,3))
到目前为止,我在单一作物和年份条件下使用了case_when,但我想对不同作物累积年份,如最后两种情况
Crop %>%
# group_by(SiteID)
mutate(CS = case_when(
Crop =="corn" & Years == 5 ~ "CoMo",
Crop =="wheat" & Years >= 3 ~ "Whea",
(Crop =="corn" | Crop =="soya") & sum(Years) == 5 ~ "CoSo",
# Years[Crop =="corn"] + Years[Crop =="soya"] == 5 ~ "CoSo",
))
中间结果如下所示:
# A tibble: 8 x 4
SiteID Crop Years CS
<chr> <chr> <dbl> <chr>
1 A soya 2 NA
2 A corn 2 NA
3 A wheat 1 NA
4 B corn 5 CoMo
5 C corn 3 CoSo
6 C soya 2 Coso
7 D soya 2 Whea
8 D wheat 3 Whea
#一个tible:8 x 4
SiteID作物年数
1个大豆2个不饱和脂肪酸
2 A玉米2 NA
3 A小麦1 NA
4 B玉米5科莫
5 C玉米3 CoSo
6 C大豆2 Coso
7D大豆2小麦
8d小麦3小麦
最后,CS将按SiteID进行汇总:
# A tibble: 4 x 2
SiteID SC
<chr> <chr>
1 A NA
2 B CoMo
3 C CoSo
4 D Whea
#一个tible:4 x 2
SiteID SC
1 A NA
2 B科莫
3 C CoSo
4d Whea
谢谢 下面是一个解释的尝试
库(dplyr)
Crop=data.frame(SiteID=c('A','A','A','B','c','c','D','D'),
作物=c(‘大豆’、‘玉米’、‘小麦’、‘玉米’、‘玉米’、‘大豆’、‘大豆’、‘小麦’),
年份=c(2,2,1,5,3,2,2,3))
场地作物%
分组依据(站点ID)%>%
#请注意,case_优先级顺序何时匹配,因此第一个匹配将是
#价值。因此,您还需要检查您的条件是否是独占的
#或者,如果它们以某种方式重叠,那么您需要优先考虑哪一个
变异(CS=情况_)(
#在此处使用any覆盖SiteID的所有记录
任何(作物=“玉米”&年份==5)~“玉米”,
任何(作物=“小麦”&年份>=3)~“小麦”,
#对于这个,我使用“长度相交”来确保
#农作物既有“玉米”又有“大豆”
长度(相交(唯一(作物),c(“玉米”、“大豆”))==2&
总和(年[以%c(“玉米”、“大豆”)表示的作物%)==5~“CoSo”,
#最后,如果任何条件都不匹配,则为NA
真~NA_性格_
))
这是案例之后的数据
Site_crop %>%
group_by(SiteID) %>%
summarize(CS = first(CS))
#> # A tibble: 4 x 2
#> SiteID CS
#> <chr> <chr>
#> 1 A <NA>
#> 2 B CoMo
#> 3 C CoSo
#> 4 D Whea
Site\u作物
#>#A tibble:8 x 4
#>#组:SiteID[4]
#>SiteID作物年数
#>
#>1大豆2
#>玉米
#>3 A小麦1
#>4 B玉米5科莫
#>5 C玉米3 CoSo
#>6 C大豆2 CoSo
#>7D大豆2小麦
#>8d小麦3小麦
每个站点ID的带有CS
的最终otuput
Site_crop %>%
group_by(SiteID) %>%
summarize(CS = first(CS))
#> # A tibble: 4 x 2
#> SiteID CS
#> <chr> <chr>
#> 1 A <NA>
#> 2 B CoMo
#> 3 C CoSo
#> 4 D Whea
站点\u作物%>%
分组依据(站点ID)%>%
总结(CS=第一(CS))
#>#tibble:4 x 2
#>站点ID CS
#>
#>1A
#>2 B科莫
#>3 C CoSo
#>4d Whea
由(v2.0.0)于2021-04-16创建的能否显示您的预期输出并解释达到该目标的逻辑?如果我想命名另一种作物序列,其中“玉米”和“大豆”与任何其他作物一起出现。我应该指定长度(intersect(unique(Crop),c(“玉米”,“大豆”))==2还是只使用sum(Years[作物百分比在%c(“玉米”,“大豆”)))>3~“CSMix”?length(intersect(unique(Crop),c(“玉米”,“大豆”))==2
这里的数字2
是因为只有两种作物“玉米”,“大豆”
如果您有3种作物状况,则数字将为3
,并且根据逻辑,可能需要您在计算年份总和时调整c(“玉米”、“大豆”)
,以包括额外的作物。