r - 根据数据框中的某些条件更改一个值
问题描述
我有一个类似于这个的数据框
session <- c(rep(34,8), rep(28,8))
trial_index <- c(rep(2,4),rep(5,4),rep(6,4),rep(8,4))
label <- c(rep(c("a","b","c","d"),4))
time <- c(10,2,7,40,4,3,6,20,5,3,5,15,4,2,3,17)
data <-data.frame(session, trial_index,label,time)
我想做的是为每个试验索引和会话更改“d”的值。每个 d 的值应该是 d = dcba。例如,对于第 34 节试验索引 2,d 应该是 40 - 7 - 2 - 10。我不需要更改 ab 和 c 的值。我不知道如何做到这一点,所以任何帮助将不胜感激。谢谢!
解决方案
这样做的一种方法是重新排列数据,使标签成为每个session-trial_index
组合的单独列。那么 d 的计算就是一个简单的基于列的减法。发布此您可以将数据转换回此原始形式。
下面是相同的示例实现
library(tidyr) # To rearrange the data
library(dplyr) # To do the subtraction
data <- tidyr::spread(data, key = label, value = time) %>% # Makes labels as columns
dplyr::mutate(d = d - c - b - a) %>%
tidyr::gather(key = label, value = time,-session,-trial_index) # Convert back
这段代码的输出是
| session| trial_index|label | time|
|-------:|-----------:|:-----|----:|
| 34| 2|a | 10|
| 34| 2|b | 2|
| 34| 2|c | 7|
| 34| 2|d | 21|
| 34| 5|a | 4|
| 34| 5|b | 3|
| 34| 5|c | 6|
| 34| 5|d | 7|
| 28| 6|a | 5|
| 28| 6|b | 3|
| 28| 6|c | 5|
| 28| 6|d | 2|
| 28| 8|a | 4|
| 28| 8|b | 2|
| 28| 8|c | 3|
| 28| 8|d | 8|
推荐阅读
- debian - crontab中的rsync不执行
- spring - 在 Spring Boot 中使用过滤器时响应需要很长时间
- python - 更改现有 matplotlib 图的颜色图
- c - %lo(source)($6) 和 .frame 在汇编代码中是什么意思?
- kotlin - 带有kotlin的黄瓜参数类型
- graphql - 如何使我的 hasura 动作准备好用于我的 ci / cd 测试?
- c - 如何知道 Linux 中看门狗重启的原因?
- python - 为什么当我输入一个值时程序会退出?
- vue.js - 当我使用 Axios 获取数据时,我的 JS 代码不起作用
- python - 有没有办法可以在 python 中使用多线程或多处理来连接到 200 个不同的服务器并从它们下载数据