R 如果是按组-检查下一行中的值

R 如果是按组-检查下一行中的值,r,tidyverse,R,Tidyverse,以下是一个df示例: test_df <- structure(list(plant_sp = c("plant_1", "plant_1", "plant_2", "plant_2", "plant_3", "plant_3", "plant_3", "plant

以下是一个df示例:

test_df <- structure(list(plant_sp = c("plant_1", "plant_1", "plant_2", "plant_2", "plant_3",
                                       "plant_3", "plant_3", "plant_3", "plant_3", "plant_4", 
                                       "plant_4", "plant_4", "plant_4", "plant_4", "plant_4",
                                       "plant_5", "plant_5", "plant_5", "plant_5", "plant_5"), 
                          sp_rich = c(1, 1, NA, 1, NA, 
                                      1, 0, 0, NA, 0,
                                      0, 1, 0, 0, 1, 
                                      0, NA, NA, 0,NA)), 
                     row.names = c(NA, -20L), class = "data.frame", 
                     .Names = c("plant_sp", "sp_rich"))
但我不知道如何引用列
sp_rich
中的值,而是在下一行(在组中

例如:

test_df <- structure(list(plant_sp = c("plant_1", "plant_1", "plant_2", "plant_2", "plant_3",
                                       "plant_3", "plant_3", "plant_3", "plant_3", "plant_4", 
                                       "plant_4", "plant_4", "plant_4", "plant_4", "plant_4",
                                       "plant_5", "plant_5", "plant_5", "plant_5", "plant_5"), 
                          sp_rich = c(1, 1, NA, 1, NA, 
                                      1, 0, 0, NA, 0,
                                      0, 1, 0, 0, 1, 
                                      0, NA, NA, 0,NA)), 
                     row.names = c(NA, -20L), class = "data.frame", 
                     .Names = c("plant_sp", "sp_rich"))
如果第4行的
sp\u rich
下有空行,我希望值“1”位于第3行的
is\u na\u nest\u row

非常感谢, Ido

测试_df%>%
分组依据(工厂sp)%>%
mutate(is_na_nest_row=+any(is.na(sp_rich)))
##tibble:20 x 3
##组:植物#sp[5]
#植物sp sp丰富,是一排植物
#                    
#1工厂1 10
#2工厂1 1 0
#3工厂2 NA 1
#4工厂2 1 1
#5工厂3 NA 1
#6工厂3 1 1
#7工厂3 0 1
#8工厂3 0 1
#9工厂3 NA 1
#10工厂4 0 0
#11工厂4 0 0
#12工厂4 1 0
#13工厂4 0 0
#14工厂4 0 0
#15工厂4 1 0
#16工厂5 0 1
#17工厂5 NA 1
#18工厂5 NA 1
#19工厂5 0 1
#20工厂5 NA 1
或者如果只是下一排

test_df%>%
分组依据(工厂sp)%>%
mutate(is_na_nest_row=+(lead(is.na(sp_rich),default=FALSE)))
##tibble:20 x 3
##组:植物#sp[5]
#植物sp sp丰富,是一排植物
#                    
#1工厂1 10
#2工厂1 1 0
#3植物2钠0
#4工厂2 1 0
#5植物3钠0
#6工厂3 1 0
#7工厂3 0 0
#8工厂3 0 1
#9植物3钠0
#10工厂4 0 0
#11工厂4 0 0
#12工厂4 1 0
#13工厂4 0 0
#14工厂4 0 0
#15工厂4 1 0
#16工厂5 0 1
#17工厂5 NA 1
#18植物5钠0
#19工厂5 0 1
#20植物5钠0

编辑:现在应该可以正常工作了

您可以使用
mutate
中的
row\u number()
访问下一行。所以我认为这是正确的解决方案

test_df %>% group_by(plant_sp) %>% mutate(Test = ifelse(is.na(sp_rich[row_number() + 1]), 1, 0),  Test = c(Test[-n()], 0)))
有输出

    # A tibble: 20 x 3
# Groups:   plant_sp [5]
   plant_sp sp_rich  Test
   <chr>      <dbl> <dbl>
 1 plant_1        1     0
 2 plant_1        1     0
 3 plant_2       NA     0
 4 plant_2        1     0
 5 plant_3       NA     0
 6 plant_3        1     0
 7 plant_3        0     0
 8 plant_3        0     1
 9 plant_3       NA     0
10 plant_4        0     0
11 plant_4        0     0
12 plant_4        1     0
13 plant_4        0     0
14 plant_4        0     0
15 plant_4        1     0
16 plant_5        0     1
17 plant_5       NA     1
18 plant_5       NA     0
19 plant_5        0     1
20 plant_5       NA     0
#一个tible:20x3
#组别:植物组[5]
工厂sp富sp测试
1工厂1 10
2工厂1 1 0
3植物2钠0
4工厂2 1 0
5植物3钠0
6工厂3 1 0
7工厂3 0 0
8工厂3 0 1
9植物3钠0
10工厂4 0 0
11工厂4 0 0
12工厂4 1 0
13工厂4 0 0
14工厂4 0 0
15工厂4 1 0
16工厂5 0 1
17工厂5 NA 1
18植物5钠0
19工厂5 0 1
20植物5钠0

(1)如果您使用的是
dplyr
,请改用
If_else
,因为
base::ifelse
有一些。(2) 坦白地说,这里不需要它,正如你所说的
mutate(is_na_nest_row=+is.na(sp_rich))
可以获得相同的效果(虽然它是整数,而不是浮点)。它不会检查同一行中是否有na.value吗?例如,如果第4行的“sp_rich”下有空行,我希望值“1”在第3行。我添加了一个例子,因为我以前不清楚,谢谢!它不会检查同一行中是否有na.value吗?例如,如果第4行的“sp_rich”下有空行,我希望值“1”位于第3行。我已经添加了一个例子,因为我以前不清楚,谢谢!您知道,如果您提供了给定示例数据的实际预期输出,这将非常有帮助。它消除了大部分歧义。谢谢!问题是,我确实需要分组。例如,第2行的值为1,即使NA行位于另一组-“plant_2”。有没有一种方法可以通过小组来完成呢?是的,有,现在我认为应该可以了!请参阅新代码和输出。