【问题标题】:Replacing values of a column in R dataframe替换R数据框中列的值
【发布时间】:2022-01-14 03:50:34
【问题描述】:

我有一个名为 C0001 的数据框,其中包含 31 个变量的 3671 个观察值。我想对一个名为 Y 的变量的每个值进行检查。如果该变量的值大于 30,则将其替换为 30,否则保留现有值。我在 R 中写了以下内容,但它给了我一个错误:

  C0001 <- read.csv("C0001.csv")
  C0001$Y<- ifelse(C0001$Y > 30, 30, C0001$Y)

ans[npos]

有人可以帮我解决我在这里犯的错误吗?有没有其他方法可以在不使用 ifelse 的情况下进行相同的操作?

谢谢

【问题讨论】:

  • 代码看起来不错,所以恐怕您应该发布一些您使用的数据,甚至尝试制作最小可重复的示例。
  • 检查列的类。只有当类是数字时,您的代码才有效;如果 R 认为该列包含字符,则需要将该列转换为数字或将 30 括在引号中。

标签: r dataframe if-statement


【解决方案1】:

尝试将read.csv() 替换为read_csv(),并检查您的核心工作目录。 read_csv() 函数将数据导入 R as a tibble,而 read.csv() 导入常规的旧 R data frame。该错误表明您的输入是 NULL 或长度为 0 的向量:确保索引正确。

library(readr)

C0001 <- read_csv("C:/Users/Desktop//C0001.csv")
C0001

> C0001
# A tibble: 6 x 3
      x     y     z
  <dbl> <dbl> <dbl>
1     2    40     4
2     3    12     5
3    45    12     6
4     1    50     7
5     1    50    30
6     1     0     0


C0001$y<- ifelse(C0001$y > 30, 30, C0001$y)
C0001

# A tibble: 6 x 3
      x     y     z
  <dbl> <dbl> <dbl>
1     2    30     4
2     3    12     5
3    45    12     6
4     1    30     7
5     1    30    30
6     1     0     0

数据样本:

structure(list(x = c(2, 3, 45, 1, 1, 1), y = c(30, 12, 12, 30, 
30, 0), z = c(4, 5, 6, 7, 30, 0)), row.names = c(NA, -6L), spec = structure(list(
    cols = list(x = structure(list(), class = c("collector_double", 
    "collector")), y = structure(list(), class = c("collector_double", 
    "collector")), z = structure(list(), class = c("collector_double", 
    "collector"))), default = structure(list(), class = c("collector_guess", 
    "collector")), skip = 1L), class = "col_spec"), class = c("spec_tbl_df", 
"tbl_df", "tbl", "data.frame"))

【讨论】:

  • 为什么会这样?这两个功能有何不同?你从哪里得到这些数据的? OP 没有提供任何类似的东西。
【解决方案2】:

像这样使用矢量化: C0001$Y &lt;- C0001$Y[C0001$Y &gt; 30]

这可以代替使用ifelse()

【讨论】:

    猜你喜欢
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 2016-02-10
    • 1970-01-01
    • 2021-06-12
    • 2014-11-12
    • 2014-08-24
    相关资源
    最近更新 更多