简体   繁体   English

如何使用 dplyr 找到每一行具有特定值的第一列

[英]How to find the first column with a certain value for each row with dplyr

I have a dataset like this:我有一个这样的数据集:

df <- data.frame(id=c(1:4), time_1=c(1, 0.9, 0.2, 0), time_2=c(0.1, 0.4, 0, 0.9), time_3=c(0,0.5,0.3,1.0))

id time_1 time_2 time_3
1    1.0    0.1    0
2    0.9    0.4   0.5
3    0.2     0    0.3
4     0     0.9   1.0

And I want to identify for each row, the first column containing a 0, and extract the corresponding number (as the last element of colname), obtaining this:我想识别每一行,第一列包含一个 0,并提取相应的数字(作为 colname 的最后一个元素),获得:

id time_1 time_2 time_3 count
 1    1.0    0.1    0     3
 2    0.9    0.4   0.5    NA
 3    0.2     0    0.3    2
 4     0     0.9   1.0    1

Do you have a tidyverse solution?你有tidyverse解决方案吗?

We may use max.col我们可以使用max.col

v1 <- max.col(df[-1] ==0, "first")
v1[rowSums(df[-1] == 0) == 0] <- NA
df$count <- v1

-output -输出

> df
  id time_1 time_2 time_3 count
1  1    1.0    0.1    0.0     3
2  2    0.9    0.4    0.5    NA
3  3    0.2    0.0    0.3     2
4  4    0.0    0.9    1.0     1

Or using dplyr - use if_any to check if there are any 0 in the 'time' columns for each row, if there are any, then return the index of the 'first' 0 value with max.col ( pick is from devel version, can replace with across ) within the case_when或使用dplyr - 使用if_any检查每一行的“时间”列中是否有任何 0,如果有,则返回带有max.col的“第一个”0 值的索引( pick来自 devel 版本,可以在case_when中替换为across )

library(dplyr)
df %>%
   mutate(count = case_when(if_any(starts_with("time"),  ~ .x== 0) ~ 
    max.col(pick(starts_with("time")) ==0, "first")))

-output -输出

   id time_1 time_2 time_3 count
1  1    1.0    0.1    0.0     3
2  2    0.9    0.4    0.5    NA
3  3    0.2    0.0    0.3     2
4  4    0.0    0.9    1.0     1

You can do this:你可以这样做:

df <- df %>% 
  rowwise() %>% 
  mutate (count = which(c_across(starts_with("time")) == 0)[1])

df
   id time_1 time_2 time_3 count
  <int>  <dbl>  <dbl>  <dbl> <dbl>
1     1    1      0.1    0       3
2     2    0.9    0.4    0.5    NA
3     3    0.2    0      0.3     2
4     4    0      0.9    1       1

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM