R:使用现有值创建一个新列,条件是另一列的组

R: Creating a new column with existing values, conditional on group of another column

我正在处理眼动追踪数据集,希望将现有列的值分配给新列,条件是第二个现有列。

我有列:“targetlocation”与因子 leftright,“right_looks”与数值,和“left_looks”带有数值。

我想做的是:

我试过创建第一个空列然后填充它们,但也许 mutate() 或 if_else() 语句在这里效果更好。有解决办法吗?

这是一种选择。

df$target_looks <- df$distractor_looks <- 0
df[df$targetlocation == 'right', c('target_looks', 'distractor_looks')] <- df[df$targetlocation == 'right', c('rightlooks', 'leftlooks')]
df[df$targetlocation == 'left', c('target_looks', 'distractor_looks')] <- df[df$targetlocation == 'left', c('leftlooks', 'rightlooks')]

这是另一种使用示例数据的方法。为清楚起见,我创建了一个简单的包含“左”和“右”的二元向量。您的 targetlocation 可能是这些水平的一个因素,而 nontargetlocation 将是该因素的反向水平。您可以使用 get 提取基于“左”或“右”的适当列名的值。

set.seed(123)

df <- data.frame(
  targetlocation = c("left", "left", "right", "left"),
  left_looks = sample(4),
  right_looks = sample(4)
)

library(tidyverse)

my_levels <- c("left", "right")

df %>%
  rowwise() %>%
  mutate(
    targetlocation = factor(targetlocation, levels = my_levels),
    nontargetlocation = rev(my_levels)[targetlocation],
    target_looks = get(paste0(targetlocation, "_looks")),
    distractor_looks = get(paste0(nontargetlocation, "_looks"))
  )

输出

  targetlocation left_looks right_looks nontargetlocation target_looks distractor_looks
  <fct>               <int>       <int> <chr>                    <int>            <int>
1 left                    3           3 right                        3                3
2 left                    4           2 right                        4                2
3 right                   1           4 left                         4                1
4 left                    2           1 right                        2                1