当前位置: 首页 > 知识库问答 >
问题:

基于行条件创建列

金瑞
2023-03-14

我有一个这样的数据

user_id  Gap itr    visit_no.(desired column)
      a  0.3   1            1
      a  0.5   1            1
      a  1.5   1            1
      a  0.9   1            2
      a  2.6   1            2
      a 0.34   1            3
      a  0.8   2            1
      a 0.34   2            1
      b  1.6   1            1
      b  0.7   1            2
      b  0.8   1            2
      b  0.7   1            2
      b  4.8   2            1
      b 0.39   2            2
      b 0.38   2            2
      b 0.89   2            2

我想创建列(visit_no)。每当间隙大于1时,我们需要在接下来的行中将visit_no值增加1,直到我们找到另一个值,它将保持不变

这是数据框架

df<-data.frame(user=c("a","a","a","a","a","a","a","a","b","b","b","b","b","b","b","b")
                    , gap=c(0.3,0.5,1.5,0.9,2.6,0.34,0.8,0.34,1.6,0.7,0.8,0.7,4.8,0.39,0.76,0.72),
                     itr=c(1,1,1,1,1,1,2,2,1,1,1,1,2,2,2,2))

共有2个答案

梁嘉祥
2023-03-14

这与AntoniosK answer非常相似,但在< code>data.table中,没有管道运算符,使用了< code>data.table的< code>shift函数。

library(data.table)
dt <- data.table(df)
dt[, visit_no := cumsum(ifelse(shift(gap, n = 1, type = "lag", fill = 0)>1,1,0)) + 1, by = c("user", "itr")]
dt
#    user  gap itr visit_no
# 1:    a 0.30   1        1
# 2:    a 0.50   1        1
# 3:    a 1.50   1        1
# 4:    a 0.90   1        2
# 5:    a 2.60   1        2
# 6:    a 0.34   1        3
# 7:    a 0.80   2        1
# 8:    a 0.34   2        1
# 9:    b 1.60   1        1
#10:    b 0.70   1        2
#11:    b 0.80   1        2
#12:    b 0.70   1        2
#13:    b 4.80   2        1
#14:    b 0.39   2        2
#15:    b 0.76   2        2
#16:    b 0.72   2        2
古刚洁
2023-03-14
library(dplyr)

df<-data.frame(user=c("a","a","a","a","a","a","a","a","b","b","b","b","b","b","b","b")
               , gap=c(0.3,0.5,1.5,0.9,2.6,0.34,0.8,0.34,1.6,0.7,0.8,0.7,4.8,0.39,0.76,0.72),
               itr=c(1,1,1,1,1,1,2,2,1,1,1,1,2,2,2,2))

df %>%
  group_by(user, itr) %>%
  mutate(visit_no = cumsum(ifelse(lag(gap, default = 2) > 1, 1, 0))) %>%
  ungroup()

# # A tibble: 16 x 4
#     user   gap   itr visit_no
#   <fctr> <dbl> <dbl>    <dbl>
# 1      a  0.30     1        1
# 2      a  0.50     1        1
# 3      a  1.50     1        1
# 4      a  0.90     1        2
# 5      a  2.60     1        2
# 6      a  0.34     1        3
# 7      a  0.80     2        1
# 8      a  0.34     2        1
# 9      b  1.60     1        1
# 10     b  0.70     1        2
# 11     b  0.80     1        2
# 12     b  0.70     1        2
# 13     b  4.80     2        1
# 14     b  0.39     2        2
# 15     b  0.76     2        2
# 16     b  0.72     2        2
 类似资料:
  • 我试图为数据集创建多水平条形图。这些数据涉及跑步比赛的比赛时间。 Dataframe有以下列:名称、年龄组、完成时间、完成地点、家乡。下面是示例数据。 我想创建一个类似下图的条形图。每个年龄组将有一个条形图,最快的跑步者在图表的底部,跑步者的名字与城市和次数跑了比赛低于他们的名字。 我需要一个for循环还是一个简单的groupby工作?每个年龄组的数量和大小可以根据种族动态变化,因此它不是一个常数

  • 我正在使用如下所示的数据框(让我们调用MyData)。我想做的是按PatientKey分组并创建一个名为NewID的新ID。每次对于同一个PatientKey,时间之间的测试是 我尝试过使用dplyr来实现这一点,但问题是,当我尝试类似于以下代码时,后续值没有改变: 对象 任何人都有方便的dplyr或数据。表格解决方案,或者循环方法。

  • 我有一张有科林斯的桌子 1 |姓名1 | 40 1 |姓名2 | 45 2 |姓名3 | 30 2 |姓名4 | 39 结果我想要这样 1 |名称1 | 40 | 2 |名称3 | 30 1 |名称2 |名称45 | 2 |名称4 | 39 大约有5公里行。 谢谢

  • 虽然这段代码似乎可以按照td行的预期更改$TDStyle,但它没有根据esleif条件适当地更新$Font和$Text。它似乎总是保持这些字符串相同,仅基于else条件,即使它不是真的。也许只是语法问题?我确信有一个更好的方法来做到这一点,但我有限的知识使我走到了这一步。有什么建议吗?

  • 我在我的方法中有一个调用,它有一个。我想知道调用的结果是否已加载,以便有条件地显示/隐藏DOM中的内容。现在看起来DOM是在该方法完成之前呈现的。但是我认为created中的方法是在DOM呈现之前调用的?

  • 此问题与几天前发布的问题类似,将行从0折叠到0 与前一个问题不同的是,我们如何根据Id折叠那些时间差小于或等于60的行。 例如,使用相同的数据集 这将通过ID计算时差 这将导致如下所示的新列差异 现在只按< code >事件折叠行。身份证明..其中时间差小于或等于60,即< code>diff 正在寻找有关如何创建这种折叠数据集的帮助。提前谢谢。