R-返回第一个给定值所在行的列名



我正在为每一行值查找数据帧中首次出现的FALSE。我的行是特定的事件,列是日期。我希望能够找到第一个FALSE的日期,这样我就可以使用该值来找到返回日期。

我的数据帧的一个示例结构:

df <- data.frame(ID = c(1,2,3), '2001' = c(TRUE, TRUE, TRUE), 
'2002' = c(FALSE, TRUE, FALSE), '2003' = c(TRUE, FALSE, TRUE))

我想得到第二个数据帧或列表,其中包含标识FALSE的第一个实例的ID和列名。

例如:

ID | Date
1  | 2002
2  | 2003
3  | 2002

我不知道找到这样一个结果的机制。

实际的数据帧包含几千行,所以很遗憾我不能手工完成。

我是一个新的R用户,所以请不要回避你可能期望一个更有经验的R用户已经考虑过的事情。

提前感谢

使用tidyverse函数尝试此操作。您可以将数据整形为长,然后筛选F值。如果有一些重复的行,第二个过滤器可以避免它们。这里的代码:

library(dplyr)
library(tidyr)
#Code
newdf <- df %>% pivot_longer(-ID) %>%
group_by(ID) %>%
filter(value==F) %>%
filter(!duplicated(value)) %>% select(-value) %>%
rename(Myname=name)

输出:

# A tibble: 3 x 2
# Groups:   ID [3]
ID Myname 
<dbl> <chr>
1     1 2002 
2     2 2003 
3     3 2002 

另一个没有重复值的选项可以使用row_number()提取第一个值(row_number()==1(:

library(dplyr)
library(tidyr)
#Code 2
newdf <- df %>% pivot_longer(-ID) %>%
group_by(ID) %>%
filter(value==F) %>%
mutate(V=ifelse(row_number()==1,1,0)) %>%
filter(V==1) %>%
select(-c(value,V)) %>% rename(Myname=name)

输出:

# A tibble: 3 x 2
# Groups:   ID [3]
ID Myname 
<dbl> <chr>
1     1 2002 
2     2 2003 
3     3 2002 

或者将base Rapply()和一个通用函数一起使用

#Code 3
out <- data.frame(df[,1,drop=F],Res=apply(df[,-1],1,function(x) names(x)[min(which(x==F))]))

输出:

ID  Res
1  1 2002
2  2 2003
3  3 2002

我们可以在反转逻辑值后将max.colties.method = 'first'一起使用。

cbind(df[1], Date = names(df[-1])[max.col(!df[-1], ties.method = 'first')])
#  ID Date
#1  1 2002
#2  2 2003
#3  3 2002

最新更新