【发布时间】: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,例如,如果所有years的var_one的值高于80。类似地,如果var_one的所有years的值B高于80,我希望新列采用1的值。我将修改我的帖子以反映您的 cmets。感谢您的关注。 -
基于描述可能
library(dplyr); df %>% group_by(case) %>% mutate(x = as.integer(all(var_one > 80)))尽管您的示例输出不同 -
您已经拥有了 cmets 中的所有解决方案。您可以添加
library(data.table) ; setDT(smpl_df)[, res := +(all(var_one > 80)), by = case],一切顺利。
标签: r dataframe data.table dplyr