r - R:仅基于前 150 行和每个参与者的现有条件创建一个新列?
问题描述
我有完成任务的 50 名参与者的数据。每个人完成 450 次试验,这些试验分为 3 个区块(每个区块 150 次试验;这些是实验条件)。条件是“快乐”、“悲伤”和“中性”,并以随机顺序呈现给参与者。每个参与者数据当前都合并到一个整体数据框中,如下所示:
参与者 | (健康)状况 |
---|---|
1 | 中性的 |
1 | 中性的 |
1 | 中性的 |
(...) | 中性的 |
2 | 快乐的 |
2 | 快乐的 |
2 | 快乐的 |
(...) | 快乐的 |
我想创建一个名为 order 的新列,用于存储参与者完成的第一个条件块。因此,如果他们先完成中性块,则将其编码为 1,如果是快乐块,则将其编码为 2,如果是悲伤块,则将其编码为 3。
由于总共有 450 次试验,而且我只对前 150 次(第一个条件块)感兴趣,所以我尝试了以下代码:
dat %>%
group_by(participant) %>%
slice(1:150) %>%
if(condition == "neutral"){
dat$order <- 1
} else if(condition == "happy"){
dat$order <- 2
} else if(condition == "sad"){
dat$order <- 3
}
但是,这会返回以下错误:条件的长度 > 1,并且只会使用第一个元素。谁能发现我哪里出错了?
解决方案
如果条件的所有 150 个值同时出现,您可以只检查first
每个参与者的值而不是 150。
library(dplyr)
dat %>%
group_by(participant) %>%
mutate(order = case_when(first(condition) == "neutral" ~ 1,
first(condition) == "happy" ~ 2,
first(condition) == "sad" ~ 3)) %>%
ungroup
推荐阅读
- node.js - 我无法安装本机反应
- python - python将列表中除第i个元素之外的所有元素相乘并返回列表
- flutter - 如何限制 Flutter 中的复选框组
- javascript - 如何将文件对象传递给 Safari 中的输入类型=文件?
- python - 如何在 pythonanywhere 服务器中上传 excel 文件,我已经上传了 python 脚本,我的 python 脚本读取了 excel 文件然后执行任务
- .net - .NET 运行非常“大”的异步任务的方法是什么?
- javascript - 为什么 Canvas 在 If 语句中不起作用?
- javascript - 如何在 React Native 中将对象从另一个屏幕导入另一个屏幕?
- node.js - 在 Azure DevOps 源上添加其他 npm 包
- visual-studio - MSVC 生成 PE32+ 文件时是否可以删除异常表 (.pdata)?