我正在为每一行值查找数据帧中首次出现的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 R
与apply()
和一个通用函数一起使用
#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.col
与ties.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