【问题标题】:For loop: replacement has one row more than dataFor循环:替换比数据多一行
【发布时间】:2013-12-06 23:03:42
【问题描述】:

我是 R 的初学者并且遇到了问题。任何帮助将不胜感激! 当我在以下(简化)情况下应用 for 循环时,我收到一条错误消息,提示“替换有 5 行,数据有 4”

Country <- c("Germany", "France", "Italy", "Spain")
Unemploy <- c(2, 3, 4, 10)
Growth <- c(2, 7, 6, 9)
data <- data.frame(Country, Unemploy, Growth)

for (i in data$Country) {
     if (identical(data$Country[i], "France")) {
          data$Growth[i] <- "5"
     } else {
          data$Growth[i] <- "2"
     }
}

以下消息发出:

Error in `$<-.data.frame`(`*tmp*`, "Growth", value = c("2", "2", "2",  : 
replacement has 5 rows, data has 4

【问题讨论】:

  • 对不起,应该是“成长”
  • 感谢 TWL 纠正错误

标签: r for-loop


【解决方案1】:

改用ifelse

data[ ,"Growth"] <- ifelse(data[ , "Country"] == "France", "5", "2")

【讨论】:

  • 对于 OP:Growth 是一个 numeric 向量,但现在它是一个 character 向量。如果这不是您的意图,请使用 52(不带引号)保持数字。
  • 为什么要混合使用 $[ 样式?
  • @flodel,现在我只使用了一种风格。 :)
【解决方案2】:

看看这个:

> for (i in data$Country){print(i)}
[1] "Germany"
[1] "France"
[1] "Italy"
[1] "Spain"

i in data$Country 语法遍历 data.frame 属性中的值。然后您使用i,就好像它是一个数字索引一样。所以你想要做的是这样的:

for (i in 1:length(data$Country)) {if (identical(data$Country[i],"France"))
+ {data$Growth[i]<-"5"}else{data$Growth[i]<-"2"}}

话虽如此,上述不是惯用的 R,请参阅@Jilber 的答案以获得更惯用的解决方案。

【讨论】:

  • fwiw,您可以使用 ifelse: data$Growth &lt;- ifelse(data$Country == 'France', '5', '2') 进行“矢量化”
  • 好点,我只是想在 :) 中添加类似的东西
  • 有一点,identical 函数中的第一个参数是作为因子提供的,这是行不通的,我建议使用identical(as.character(data$Country[i]), "France"),或者试试data$Country[i]=="France"
【解决方案3】:

试试:

for (i in 1:length(data$Country)) {
    ...

【讨论】:

  • 您的回答不会对已有的答案添加任何内容。
  • 也不对。您是否使用示例数据运行它?我猜没有
猜你喜欢
  • 2021-07-08
  • 2022-01-14
  • 2011-09-22
  • 2012-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-04
相关资源
最近更新 更多