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

ctzwtxfj  于 2023-01-15  发布在  其他
关注(0)|答案(2)|浏览(207)

我有这样一个数据集:

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

我想为每一行确定第一列包含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

您有tidyverse解决方案吗?

yacmzcpb

yacmzcpb1#

我们可以使用max.col

v1 <- max.col(df[-1] ==0, "first")
v1[rowSums(df[-1] == 0) == 0] <- NA
df$count <- v1
  • 输出
> 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

或者使用dplyr-使用if_any检查每行的"时间"列中是否有任何0,如果有,则使用max.colpick来自devel版本,可以替换为across)返回case_when中"第一个" 0值的索引

library(dplyr)
df %>%
   mutate(count = case_when(if_any(starts_with("time"),  ~ .x== 0) ~ 
    max.col(pick(starts_with("time")) ==0, "first")))
  • 输出
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
fcg9iug3

fcg9iug32#

您可以执行以下操作:

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

相关问题