【问题标题】:Using a string distance technique to create a factor variable in R使用字符串距离技术在 R 中创建因子变量
【发布时间】:2023-03-09 06:34:01
【问题描述】:

我是一名新的 R 爱好者,致力于扩展我的知识。我正在阅读 Edwin de JongeMark van der Loo 撰写的 An Introduction To Data Cleaning With R 文章。我正在做练习 2.4,如果有人能证实我解决这个特定问题的技巧,我将不胜感激: 这是原始数据:

1 // Survey data. Created : 21 May 2013
2 // Field 1: Gender
3 // Field 2: Age (in years)
4 // Field 3: Weight (in kg)
5 M;28;81.3
6 male;45;
7 Female;17;57,2
8 fem.;64;62.8

这是我能够构建的更简洁的版本:

df:  
Gender Age..in.years. Weight..in.kg.
1      M             28           81.3
2   male             45           <NA>
3 Female             17           57,2
4   fem.             64           62.8

这就是我使用 adist 重新编码得到的结果

D:
rawtext  coded
1       M   male
2    male   male
3  Female female
4    fem. female

现在我必须将 Gender 列转换为带有标签 man 和 woman 的因子变量。 我不知道如何继续,我正在考虑将数据的性别列更改为以下列向量:

    f <- factor(D$coded, levels = c("male", "female"), labels = c("man", "woman"))

返回:

    [1] man   man   woman woman
    Levels: man woman

我是正确的还是完全错误的?有没有办法使用transform直接改变df中的Gender变量?即这样做更好:

df$Gender <- plyr::revalue(D$coded, c(male = "man", female = "woman"))

或者是否有另一种方法可以在不使用多个 ifesle 命令的情况下将 Gender 变量的观察结果更改为“男人”或“女人”?

我试图通过更多地了解因素来获得答案,但在任何地方都找不到与此非常相似的东西。 谢谢。

【问题讨论】:

  • 您应该显示数据,以便轻松重现。这是一个参考:stackoverflow.com/questions/5963269/…
  • 你能显示D$coded的结果吗?级别排序在那里有所不同
  • 对不起,我也不是 StackOverFlow 方面的专家。 D 数据是第三个代码块。
  • @Buckeye14Guy 看看 Frank 的链接,它有 很多 对提出好问题的好建议。您可以做的最好的事情之一就是使用 dput 共享您的数据。
  • 我不清楚您在这里实际问的是什么问题?也许您可以突出显示您遇到问题的部分,然后介绍或结束问题到底是什么不适合您?

标签: r


【解决方案1】:

线

f <- factor(D$coded, levels = c("male", "female"), labels = c("man", "woman"))

确实起作用了,但只是因为你很幸运——也就是说,因为D$coded 的等级是按照c("male", "female") 的顺序排列的。如果它们的顺序不同,那么男人和女人的标签就会被转移到你的新因素中。 (毕竟,您永远不会在该行中指定哪个级别应该转到“男性”以及哪个级别应该转到“女性”!)

在重新评估因子的水平时,使用 plyr 包中的 revalue 函数更安全、更简单:

f <- plyr::revalue(D$coded, c(male = "man", female = "woman"))

【讨论】:

  • 很好用!谢谢。我确实遇到了向量是 的问题,这就是为什么我在 f 中引入 levels 参数以保持该顺序。有没有办法使用 transform(gender = factor(df, levels = ..., labels = ...)) 其中 df 是第二个代码块中的数据?
  • @Buckeye14Guy 第二个代码块,不行,你需要使用adist从第二个代码块到第三个代码块。但你说你已经这样做了
【解决方案2】:

使用基础 R:

levels(f) <- list(man = "male", woman = "female")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 2014-08-26
    • 1970-01-01
    • 2021-08-23
    相关资源
    最近更新 更多