r - 根据来自另一个数据帧的一组规则在一个数据帧中创建一组变量
问题描述
这个问题听起来有点笼统,但我认为一个例子会更清楚:
我有以下两个数据框
数据1
group1 group2 group3 Level
cat cat dog 1
dog parrot cat 1
mouse dolphin dolphin 1
red blue blue 2
green yellow green 2
black purple cat 2
数据2
var1 level Score
cat 1 1
dog 1 1
mouse 1 1
dolphin 1 0
parrot 1 1
red 2 1
blue 2 1
green 2 1
purple 2 1
cat 2 0
black 2 0
yellow 2 1
我想根据“级别”的级别(级别是一个因素)使用我在 data2 的“分数”列中找到的值来修改包含 3 个新列(每个 group1、group2 和 group3 一个)的 data1。所以基本上我想获得这样的东西:
group1 group2 group3 Level var1 var2 var3
cat cat dog 1 1 1 1
dog parrot cat 1 1 1 1
mouse dolphin dolphin 1 1 0 0
red blue blue 2 1 1 1
green yellow green 2 1 1 1
black purple cat 2 0 1 0
样本数据
df1 <- structure(list(
group1 = c("cat", "dog", "mouse", "red", "green", "black"),
group2 = c("cat", "parrot", "dolphin", "blue", "yellow", "purple"),
group3 = c("dog", "cat", "dolphin", "blue", "green", "cat"),
Level = structure(c(1L, 1L, 1L, 2L, 2L, 2L), .Label = c("1", "2"), class = "factor")),
row.names = c(NA, -6L), class = "data.frame")
df2 <- structure(list(
var1 = c("cat", "dog", "mouse", "dolphin", "parrot", "red", "blue", "green", "purple", "cat", "black", "yellow"),
level = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("1", "2"), class = "factor"),
Score = c(1L, 1L, 1L, 0L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 1L)),
row.names = c(NA, -12L), class = "data.frame")
解决方案
我们可以将第一个数据集转为“长”格式,与第二个数据集连接,然后将其转回“宽”格式
library(dplyr)
library(tidyr)
library(stringr)
df1 %>%
mutate(rn = row_number()) %>%
pivot_longer(cols = -c(rn, Level), values_to = 'var1') %>%
rename(level = Level) %>%
left_join(df2) %>%
mutate(name = str_replace(name, 'group', 'varn')) %>%
na.omit %>%
select(-level, -var1) %>%
pivot_wider(names_from = name, values_from = Score, values_fill = list(Score = 0)) %>%
select(-rn) %>%
bind_cols(df1, .)
# group1 group2 group3 Level varn1 varn2 varn3
#1 cat cat dog 1 1 1 1
#2 dog parrot cat 1 1 0 1
#3 mouse dolphin dolphin 1 1 0 0
#4 red blue blue 2 1 1 1
#5 green yellow green 2 1 0 1
#6 black purple cat 2 0 1 0
推荐阅读
- github - 如何使用 Google Analytics 4 - 测量 ID 跟踪 github 页面?
- c# - 将项目从 .NET5 转换为 .NET Framework 4.8
- php - 在 laravel 闭包函数之外访问变量
- php - 产品存档模板上的添加到购物车通知在定制器之外不起作用
- node.js - 在批处理完成之前调用批处理提交
- c# - 是否可以在 .NET 中运行 PHP 函数?
- html - 重构网站,HTML 表单不再起作用
- python - 使用 .isna().all() 的模棱两可的值错误
- python - 构建 dlib - #include
未找到 - c++ - 让友元函数访问类的受保护成员