首页 > 解决方案 > 根据数据框中的某些条件更改一个值

问题描述

我有一个类似于这个的数据框

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 的值。我不知道如何做到这一点,所以任何帮助将不胜感激。谢谢!

标签: rdataframe

解决方案


这样做的一种方法是重新排列数据,使标签成为每个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|

推荐阅读