我正在进行一项研究,参与者每年接受一次判断.如果判断在50岁之前开始,参与者应被分配到"年轻"组.这个定义是永久性的,所以如果他们在≥50的时候被再次判断,他们仍然应该被定义为"年轻".如果他们在≥50岁时第一次被判断,他们会被分配到"老"组.

换句话说,参与者只能是年轻的或年老的,他们不能在研究过程中从年轻切换到老年.

现在,我的数据(>20000行)错误地如下所示:

ID <- c("person1", "person1", "person2", "person3", "person3", "person3", "person4")
timepoint <- c(2020,2021,2018,2015,2016,2017,2021)
age <- c(49, 50, 45, 48, 49, 50, 55)
group <- c("young", "old", "young", "young", "young", "old", "old")
myinput <- data.frame(ID, timepoint, age, group)

>myinput
       ID timepoint age group
1 person1      2020  49 young
2 person1      2021  50   old
3 person2      2018  45 young
4 person3      2015  48 young
5 person3      2016  49 young
6 person3      2017  50   old
7 person4      2021  55   old

在第2行和第6行,第group行是不正确的,因为按照我上文所述的规则,第person1行和第person3行被永久定义为年轻.

本质上,我需要R来判断列表,以查看Person是否曾经被列为myinput$age < 50,并为所有行定义myinput$ = "young",其中包含一个个体ID,可能使用if else.

请注意,情况并非如此.

       ID timepoint age group
1 person1         1  49 young
2 person1         2  50 young
3 person2         1  45 young
4 person3         1  48 young
5 person3         2  49 young
6 person3         3  50 young
7 person4         1  55   old

Edit:谢谢大家给出的有用答案!

推荐答案

dplyr

library(dplyr)
myinput %>%
  mutate(
    group = if (any(age < 50)) "young" else "old",
    .by = ID
  )
#        ID timepoint age group
# 1 person1      2020  49 young
# 2 person1      2021  50 young
# 3 person2      2018  45 young
# 4 person3      2015  48 young
# 5 person3      2016  49 young
# 6 person3      2017  50 young
# 7 person4      2021  55   old

使用.by=是dplyr-1.1.0中引入的较新功能;如果您有一个较旧的版本并且无法升级,或者如果您要在周围的操作中执行其他分组操作,则使用

myinput %>%
  group_by(ID) %>%
  mutate(
    group = if (any(age < 50)) "young" else "old"
  )

base R

(多做一点,效果是一样的.)

ifelse(
  ave(1:nrow(myinput), myinput$ID, FUN = function(z) any(myinput$age[z] < 50)),
  "young", "old")
# [1] "young" "young" "young" "young" "young" "young" "old"  

然后重新赋值到myinput$group

使用ave有点麻烦,因为返回值总是被强制为第一个参数的类(1:nrow(.)).我们可以看到,内部函数(any(myinput$age[z] < 50))本身返回逻辑,这被强制为FALSE=0和TRUE=1.

R相关问答推荐

如何替换R中数据集列中的各种字符串

从有序数据中随机抽样

向gggplot 2中的数据和轴标签添加大写和星号

使用ggsankey调整Sankey图中单个 node 上的标签

使用外部文件分配变量名及其值

为什么我的基准测试会随着样本量的增加而出现一些波动?

在数组索引上复制矩阵时出错

如何在R中描绘#符号?

R:如果为NA,则根据条件,使用列名模式将缺少的值替换为另一列中的值

将项粘贴到向量中,并将它们分组为x的倍数,用空格分隔

正则表达式在第二个管道和第二个T之后拆分R中的列

使用列中的值来调用函数调用中应使用的其他列

创建在文本字符串中发现两个不同关键字的实例的数据框

用满足特定列匹配的另一行替换NA行

排序R矩阵的行和列

隐藏基于 case 总数的值

如何编辑被动式数据表?

对一个数据帧中另一个数据帧中的值进行计数

在使用ggplot2的情况下,如何在使用coord_trans函数的同时,根据未转换的坐标比来定位geom_瓷砖?

动态统计函数在ShinyApp内部更改