转置 R 数据框中的单个单元格

Transpose individual cells in R dataframe

这是数据帧的图像:

我从一项认知心理任务中获得了这个数据框,在该任务中,人们对形状和声音做出反应。他们应该始终按该顺序响应,但有时他们会切换但仍然正确响应(例如,请参见倒数第二行)。我可以轻松地隔离这些行,但我想转置响应时间,以便它们位于正确的列中。在示例中,形状刺激的响应时间 1628 应在 'RT1' 列中,声音响应 1462 应在 'RT2'.

列中

我可以使用什么函数或代码来转置给定行和列坐标的单元格?理想情况下,我会在 'if' 语句的上下文中使用它来 select 响应被转置的行。

希望这是有道理的。我不能分享实际的数据框。

假设您的数据如下所示:

dat <- data.frame(
  Type1 = c("SHAPE", "SHAPE", "SOUND", "SHAPE"),
  Type2 = c("SOUND", "SOUND", "SHAPE", "SOUND"),
  RT1 = 10 + 1:4,
  RT2 = 20 + 1:4)

基础 R

swaps <- dat$Type1 == "SOUND" & dat$Type2 == "SHAPE"
tmp1 <- dat$Type2[swaps]
dat$Type2[swaps] <- dat$Type1[swaps]
dat$Type1[swaps] <- tmp1
tmp1 <- dat$RT2[swaps]
dat$RT2[swaps] <- dat$RT1[swaps]
dat$RT1[swaps] <- tmp1
dat
#   Type1 Type2 RT1 RT2
# 1 SHAPE SOUND  11  21
# 2 SHAPE SOUND  12  22
# 3 SHAPE SOUND  23  13
# 4 SHAPE SOUND  14  24

dplyr

library(dplyr)
dat %>%
  mutate(
    swaps = Type1 == "SOUND" & Type2 == "SHAPE",
    tmp = if_else(swaps, Type2, Type1),
    Type2 = if_else(swaps, Type1, Type2),
    Type1 = tmp,
    tmp = if_else(swaps, RT2, RT1),
    RT2 = if_else(swaps, RT1, RT2),
    RT1 = tmp
  ) %>%
  select(-tmp)

data.table

library(data.table)
as.data.table(dat)[ Type1 == "SOUND" & Type2 == "SHAPE",
    c("Type1", "Type2", "RT1", "RT2") := .(Type2, Type1, RT2, RT1) ]