【问题标题】:identify change in row observation values识别行观察值的变化
【发布时间】:2021-03-04 16:29:49
【问题描述】:

我有兴趣识别从 0 到 0.5 或 1 的个人。以下是示例数据:

id     x
1      0 
1      1
1      1 
2      0
2     .5
2     .5
3      0  
3      0 

我想要一个新的 df 来指示每个人是从 0 移动到 0.5 还是 1。像这样;

id    endorsed
1      TRUE
2      TRUE
3      FALSE  

我尝试为此使用 ifelse,但我无法正确获取代码。有人有什么建议吗?

【问题讨论】:

  • 它们总是从零开始吗?
  • 是的,观察总是从 0 开始。
  • 可能是aggregate(x ~ id, df1, function(x) sd(x) != 0) 甚至是aggregate(x ~ id, df1, any)

标签: r dataframe if-statement


【解决方案1】:

通过“id”进行分组的选项,检查“x”中的any值是否为0,下一个值是0.5或1(使用lead)(假设精度是正确的)

library(dplyr)
df1 %>%
   group_by(id) %>%
   summarise(endorsed = any(x == 0 & lead(x) %in% c( 0.5, 1)))

-输出

# A tibble: 3 x 2
#     id endorsed
#* <int> <lgl>   
#1     1 TRUE    
#2     2 TRUE    
#3     3 FALSE   

数据

df1 <- structure(list(id = c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L), x = c(0, 
1, 1, 0, 0.5, 0.5, 0, 0)), class = "data.frame", row.names = c(NA, 
-8L))

【讨论】:

  • 谢谢@akrun!
  • @D.Fowler 我的回答是基于您帖子中的描述
  • 它似乎不起作用。它给出了所有的错误。我不知道为什么。
  • @D.Fowler 根据我帖子中的数据,它给出了输出
  • 哦,好吧,我明白了。我现在看到问题是因为我有因素,但代码似乎出于某种原因在数字上工作。感谢您的帮助!
【解决方案2】:

由于它们总是从零开始,您可以分组并询问它们是否达到了 0.5 或 1:

df1 %>% group_by(id) %>% summarize(endorsed = any(x %in% c(0.5, 1)))

【讨论】:

  • 谢谢@Elle!
【解决方案3】:

使用aggregate 的基本 R 选项

aggregate(
  cbind(endorsed = x) ~ id,
  df,
  function(v) head(v, 1) == 0 & tail(cummax(v), 1) %in% c(.5, 1)
)

给予

  id endorsed
1  1     TRUE
2  2     TRUE
3  3    FALSE

【讨论】:

    猜你喜欢
    • 2014-05-29
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多