R:使用现有值创建一个新列,条件是另一列的组
R: Creating a new column with existing values, conditional on group of another column
我正在处理眼动追踪数据集,希望将现有列的值分配给新列,条件是第二个现有列。
我有列:“targetlocation”与因子 left 和 right,“right_looks”与数值,和“left_looks”带有数值。
我想做的是:
- 为“target_looks”和“distractor_looks”创建新列,其中:
- 如果“targetlocation”是right,则“right_looks”的值被分配给“target_looks”,“left_looks”被分配给“distractor_looks”
- 如果“targetlocation”是left,则“left_looks”中的值将分配给“target_looks”,而“right_looks中的值]”被分配给“distractor_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
我正在处理眼动追踪数据集,希望将现有列的值分配给新列,条件是第二个现有列。
我有列:“targetlocation”与因子 left 和 right,“right_looks”与数值,和“left_looks”带有数值。
我想做的是:
- 为“target_looks”和“distractor_looks”创建新列,其中:
- 如果“targetlocation”是right,则“right_looks”的值被分配给“target_looks”,“left_looks”被分配给“distractor_looks”
- 如果“targetlocation”是left,则“left_looks”中的值将分配给“target_looks”,而“right_looks中的值]”被分配给“distractor_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