【问题标题】:Assigning logical value to values higher than given threshold for each case across each year为每年的每个案例分配高于给定阈值的值的逻辑值
【发布时间】:2015-06-30 10:32:30
【问题描述】:

我有一个类似于下面摘录的数据框:

set.seed(1)
smpl_df <- data.frame(year = c(1500:2011), case = LETTERS[1:4])
smpl_df$var_one <- sample(100, size = nrow(smpl_df), replace = TRUE)

我有兴趣在此数据框中再添加一列。如果 var_one 列中的值在数据集中表示的所有连续年份都高于给定阈值,我对该列感兴趣以获取值 1。例如,在目前的格式中,表格如下所示:

 head(smpl_df)
  year case var_one
1 1500    A      27
2 1501    B      38
3 1502    C      58
4 1503    D      91
5 1504    A      21
6 1505    B      90

我想在数据表中添加一列(新列的值不对,只是作为示例介绍)

  year case var_one var_one_higher_than_80_for_all_yrs_for_this_case
1 1500    A      27 0
2 1501    B      38 0
3 1502    C      58 0
4 1503    D      91 1
5 1504    A      21 0
6 1505    B      90 1

编辑

在下面的 cmets 中表达的有用点添加到帖子中。我目前正在使用的长表可以从下面的宽表中获得。在下面的示例中,我添加了列 NewColumn,如果给定的 case 值高于 2,则其取值 Yes,如果值小于或等于,则添加 No 2 多年来。我想达到同样的效果,但在我的长桌 (sample_df) 上。

编辑 2

根据有关所需最终输出的有用 cmets,我的目的是生成一个对应于下表中最后一列的列。

【问题讨论】:

  • 这是一个 Heaviside 函数。例如,检查fBasics 中的Heaviside 函数。
  • 在使用sample时应该使用set.seed。你想要的输出对我来说也不是很清楚。
  • @DavidArenburg 相对于set.seed 的点。为了澄清输出,我希望新列取值1,例如,如果所有yearsvar_one 的值高于80。类似地,如果var_one 的所有years 的值B 高于80,我希望新列采用1 的值。我将修改我的帖子以反映您的 cmets。感谢您的关注。
  • 基于描述可能 library(dplyr); df %&gt;% group_by(case) %&gt;% mutate(x = as.integer(all(var_one &gt; 80))) 尽管您的示例输出不同
  • 您已经拥有了 cmets 中的所有解决方案。您可以添加library(data.table) ; setDT(smpl_df)[, res := +(all(var_one &gt; 80)), by = case],一切顺利。

标签: r dataframe data.table dplyr


【解决方案1】:

ifelse 结构可能会有所帮助: smpl_df$var_one_higher &lt;- ifelse("your func",1,0)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 2021-05-13
    • 2020-01-14
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    相关资源
    最近更新 更多