【问题标题】:Replacing character values in Data Frame Column with numeric value用数值替换数据框列中的字符值
【发布时间】:2014-03-20 04:34:01
【问题描述】:

我正在研究 SAT 分数数据库:https://nycopendata.socrata.com/Education/SAT-Results/f9bf-2cp4?

这就是它的样子:

> head(SAT)
 DBN                                   SCHOOL.NAME Num.of.SAT.Test.Takers
1 01M292 HENRY STREET SCHOOL FOR INTERNATIONAL STUDIES                     29
2 01M448           UNIVERSITY NEIGHBORHOOD HIGH SCHOOL                     91
3 01M450                    EAST SIDE COMMUNITY SCHOOL                     70
4 01M458                     FORSYTH SATELLITE ACADEMY                      7
5 01M509                       MARTA VALLE HIGH SCHOOL                     44
6 01M515       LOWER EAST SIDE PREPARATORY HIGH SCHOOL                    112
  SAT.Critical.Reading.Avg..Score SAT.Math.Avg..Score SAT.Writing.Avg..Score
1                             355                 404                    363
2                             383                 423                    366
3                             377                 402                    370
4                             414                 401                    359
5                             390                 433                    384
6                             332                 557                    316

在 Num.of.SAT.Test.Takers 列中,许多值只是字符“s”。 's' 列的对应值也有 's' 并且没有数字分数。

> SATnocandidates<-SAT[SAT$Num.of.SAT=='s', ]
> head(SATnocandidates)
      DBN                                 SCHOOL.NAME Num.of.SAT.Test.Takers
23 02M392                  MANHATTAN BUSINESS ACADEMY                      s
24 02M393                   BUSINESS OF SPORTS SCHOOL                      s
26 02M399  THE HIGH SCHOOL FOR LANGUAGE AND DIPLOMACY                      s
39 02M427       MANHATTAN ACADEMY FOR ARTS & LANGUAGE                      s
41 02M437 HUDSON HIGH SCHOOL OF LEARNING TECHNOLOGIES                      s
42 02M438   INTERNATIONAL HIGH SCHOOL AT UNION SQUARE                      s
   SAT.Critical.Reading.Avg..Score SAT.Math.Avg..Score SAT.Writing.Avg..Score
23                               s                   s                      s
24                               s                   s                      s
26                               s                   s                      s
39                               s                   s                      s
41                               s                   s                      s
42                               s                   s                      s

问题

  1. 在原始 SAT 数据帧中,我想用数字向量 0 替换 $Num.of.SAT 列中的所有 's' 值。
  2. 随后,我想选择性地将相应列中的所有 's' 值替换为 0。
  3. 如何编写一个总体命令来查找数据框中的所有 's' 值并将其替换为 0?

【问题讨论】:

  • “s”是缺失值吗?如果是这样,在读取数据时将“s”设置为na.strings 值....
  • 确实,NA 可能比 0 好。(0 会弄乱您的直方图、相关性、平均值...)
  • 阿南达,我是一个没有编程背景的初学者。它可能是一个缺失值,但我宁愿将其设置为数字 0。因为最终我需要添加行、列并做饼图/箱线图等。
  • @vagabond:更有理由希望它是 NA(意思是缺失值)而不是零。如果您显示箱线图,NA 值将被自动删除。如果您将它们设置为 0,您的箱线图将拉伸为零,并且看起来很多人未通过测试。同样,如果您想找到测试的中位数或均值,只需设置 na.rm=TRUE,它们就会被删除:但您的零值会使均值/中位数偏低。
  • @vagabond, NA 即使你声明你必须做的事情,仍然会比 0 好。 NA 和 0 表示完全不同的东西......

标签: r replace dataframe multiple-columns


【解决方案1】:

我的评论作为答案...

使用na.strings 参数读取您的数据。假设您已将数据集的 CSV 版本下载到“下载”目录,您将使用如下命令:

SAT <- read.csv("~/Downloads/SAT_Results.csv", na.strings = "s")

请注意,na.strings 参数是复数形式——您可以将多个值读入为 NA


如果数据已经在您的 R 工作区中,另一种选择是通过强制来摆脱您的“s”值。这些列目前可能是因素或字符。如果您将它们转换为数字,“s”值将自动变为NA(您会收到警告,但警告只是告诉我们我们已经知道的内容)。

例如,假设我们从这里开始:

SAT <- read.csv("~/Downloads/SAT_Results.csv", na.strings = "s")

如果我们想对所有数字列(除前两列之外的所有列)应用我们的操作,我们可以这样做:

SAT[-c(1, 2)] <- lapply(SAT[-c(1, 2)], function(x) as.numeric(as.character(x)))

或者,如果您只想更改第三列,您可以使用以下内容:

SAT[[3]] <- as.numeric(as.character(SAT[[3]]))

【讨论】:

  • 正确。因此,如果我有多个要替换的值,例如 s、r 和 t,我可以编写:SAT
  • 另外,Ananda,这回答了我的第三个问题: - 将所有 's' 替换为 NA。如果我想有选择地替换一列或一行或一个特定值呢?
猜你喜欢
  • 2021-09-08
  • 1970-01-01
  • 2011-03-22
  • 1970-01-01
  • 2018-01-31
  • 2014-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多