R 不同行上的条件求和时的情况

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)) 到目前为止,我在单一作物和年份条件

我想根据某些作物的种植年限,在不同的地点(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))
到目前为止,我在单一作物和年份条件下使用了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(“玉米”、“大豆”)
,以包括额外的作物。