0

我试图在每个行值的数据框中找到第一次出现的 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 用户已经考虑过的事情。

提前致谢

4

2 回答 2

1

试试这个使用tidyverse函数。您可以将数据重新整形为 long,然后过滤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 Rwithapply()和泛型函数:

#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
于 2020-11-17T22:04:09.453 回答
0

我们可以在反转逻辑值后使用max.colwith 。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
于 2020-11-18T01:01:06.353 回答