首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何修复`$<-.data.frame`替换有x行,数据有y行错误?

如何修复`$<-.data.frame`替换有x行,数据有y行错误?
EN

Stack Overflow用户
提问于 2019-09-12 18:42:07
回答 2查看 12.3K关注 0票数 1

我的目标是创建一个for循环,将数据集中的某些特定列转换为因子或整数。

条件将基于列的名称。

代码语言:javascript
运行
复制
# Here is a small reproducible dataset
df <- data.frame(x = c(10,20,30), y = c("yes", "no", "no"), z = c("Big", "Small", "Average"))

# here is a vector that we are going to use inside our if statement
column_factor_names <- c("y", "z")

# for each column in df
for (i in names(df)) {

    print(i)

    # if it's a factor, convert into factor, else convert it into integer

    if (i %in% column_factor_names) {
        print("it's a factor")
        df$i <- as.factor(df$i)
    } else {
        print("it's an integer")
        df$i <- as.integer(df$i)
    }
}

当我运行这个命令时,我得到:Error in `$<-.data.frame`(`*tmp*`, "i", value = integer(0)) : replacement has 0 rows, data has 3

问题出在if-else语句中的df$i <- as.factor(df$i)df$i <- as.integer(df$i)行。

但我不明白的是,当我手动运行它时。例如:

代码语言:javascript
运行
复制
df$"x" <- as.integer(df$"x")
df$"y" <- as.factor(df$"y")
df$"z" <- as.factor(df$"z")

str(df)

它正在工作:

代码语言:javascript
运行
复制
'data.frame':   3 obs. of  3 variables:
 $ x: int  10 20 30
 $ y: Factor w/ 2 levels "no","yes": 2 1 1
 $ z: Factor w/ 3 levels "Average","Big",..: 2 3 1

我的问题是:为什么它不能在for-loop和if语句中工作?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-12 18:45:59

在您的代码中,子集函数$查找名为i的列,而不是计算i。您可以选择使用[, i][[i]]以不同方式设置data.frame的子集

代码语言:javascript
运行
复制
x <- data.frame(x = c(10,20,30), y = c("yes", "no", "no"), z = c("Big", "Small", "Average"))

# here is a vector that we are going to use inside our if statement
column_factor_names <- c("y", "z")

# for each column in df
for (i in names(df)) {

  print(i)

  # if it's a factor, convert into factor, else convert it into integer

  if (i %in% column_factor_names) {
    print("it's a factor")
    x[[i]] <- as.factor(x[[i]])
  } else {
    print("it's an integer")
    x[[i]] <- as.integer(x[[i]])
  }
}

更多信息请参见help("$")

如果你不介意丢失状态消息,你也可以在不需要循环的情况下这样做:

代码语言:javascript
运行
复制
x[, i] <- as.factor(x[, i])
票数 2
EN

Stack Overflow用户

发布于 2019-09-12 19:00:59

为您更正的循环部分代码为:

代码语言:javascript
运行
复制
# Here is a small reproducible dataset
df <- data.frame(x = c(10,20,30), y = c("yes", "no", "no"), z = c("Big", "Small", "Average"))

# here is a vector that we are going to use inside our if statement
column_factor_names <- c("y", "z")

for (i in names(df)) {
    print(i)
    if (i %in% column_factor_names) {
        print("it's a factor")
        df[,i] <- as.factor(df[,i])
    } else {
        print("it's an integer")
        df[,i] <- as.numeric(df[,i])
    }
 }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57905007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档