【问题标题】:How do I compare variables from different datasets and mutate the variable accordingly in RStudio?如何比较来自不同数据集的变量并在 RStudio 中相应地改变变量?
【发布时间】:2021-01-12 22:11:20
【问题描述】:

比较来自两个不同数据集的两个项目并相应地改变变量

总结

尊敬的 Stackoverflow 社区, 我正在尝试将来自一个数据集(data1)的列/变量(item1)与来自不同数据集(data2)的列/变量(item1)进行比较。我想mutatedataset1 中比较的列/变量(item1)到数据集data2 的第三个变量(字母)。

不幸的是,我收到了错误消息 "Error in UseMethod("mutate_") : 'mutate_' 的不适用方法应用于“逻辑”类的对象。” 使用我的代码。

我创建了两个数据示例集和一个显示我尝试使用 R 生成的输出的数据集,您可以在下面的 Dropbox 链接中找到。

下载到示例数据集(+ 所需输出的可视化)

https://www.dropbox.com/sh/eido04eiocuw06l/AABiCr2EpRf4PPsb1HYLLGFna?dl=0

我的代码

data1 <- read.csv2("data 1.csv")
data2 <- read.csv2("data 2.csv")

attach(data1)
attach(data2)

data1 <- as.data.frame(data1)
data2 <- as.data.frame(data2)

if(data1$item.1 = data2$item.1) %>%
  mutate(data1$item.1 == data2$letter)

背景

我从 moodle 下载了一个大数据集,我需要转换数据集才能进行分析。今天下午,我和同事一起尝试这个方法太久了,现在我们希望得到一些建议(因为我们刚开始使用 R)。

提前致谢,祝您有美好的一天!

卡拉

【问题讨论】:

  • 您的代码有几个问题。在前面,我建议您通过dplyr.tidyverse.org 阅读更多教程。
  • (1) if(data1$item.1 = data2$item.1) 是在做一个assignment,而不是一个comparison;见stackoverflow.com/q/28176650/3358272。另外,由于我推断data1 有不止一行,这将失败,因为if 需要长度为 1,但这里的比较将返回一个向量,只要框架中的行。
  • (2) if (...) %&gt;% mutate(...) 毫无意义,我不知道你在这里想做什么。通常,您会看到if (...) { some_code; } else { other_code; }somedata %&gt;% mutate(...)。 (3) mutate 需要一组命名的表达式,所以mutate(expression) 应该是mutate(newvar = expression)
  • (4) 不要先attach(data1),然后再data1 = as.data.frame(data1)。在您的情况下,只需删除 attach 调用,您没有使用它们。 (事实上​​,如果你正在阅读的教程是推荐attach,而你可以选择使用另一个教程,我推荐它。使用attach 是草率的,增强很少,有风险,并鼓励坏习惯。 )
  • 如果您想有条件地添加基于另一个 data.frame 的变量(正如@r2evans 建议的那样,将其通过管道传输到 data.frame,例如 @ 987654342@).

标签: r dataset dplyr


【解决方案1】:
data1 <- read.csv2("stackoverflow/data_1.csv")
data2 <- read.csv2("stackoverflow/data_2.csv")

# Get data in format where there are only two columns
long_data1 <- tidyr::gather(data1, key = "key", value = "value", -person) 
long_data2 <- tidyr::gather(data2, key = "key", value = "value", -letter)

# Merge on those two columns
merged_data <- merge(long_data1, long_data2, by = c("key", "value"))

# Tidy up the results
merged_data <- subset(merged_data, select = c(person, letter, key))

final_data <- tidyr::spread(merged_data, key = key, value = letter)

我能想出的最简洁的解决方案是获取 long 格式的数据 - 每个观察都有自己的行 - 然后合并列。 tidyr 包在这方面做得最好,如果您还没有安装它,则需要与 install.packages(tidyr) 一起安装它。

【讨论】:

  • 感谢 Ashetty,这已经帮了我很多忙了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多