【问题标题】:What is wrong with my for-loop? -gsub rownames我的 for 循环有什么问题? -gsub 行名
【发布时间】:2017-10-02 10:07:06
【问题描述】:

我想遍历我的所有行并重命名它们。基本上我只想在我的数据框中删除一些单词(每行名称中的相同模式)。

代码:

for (i in rownames(df)) {

  row.names(df)[i] <- gsub("*The words I want to remove*", "", row.names(df)[i])
}

我收到以下错误:

row.names&lt;-.data.frame(*tmp*, value = c("我要删除的字词", 中的错误: 'row.names' 长度无效

请注意,代码在循环之外可以正常工作。

【问题讨论】:

  • 不需要循环。试试gsub(paste(words_to_remove, collapse = '|'), '', rownames(df))
  • 如果子字符串只需要删除一个由单词组成的字符,更安全的方法是使用rownames(df) &lt;- gsub(paste0("\\b(?:", paste(words_to_remove, collapse = '|'), ")\\b"), '', rownames(df))

标签: r for-loop dataframe gsub rowname


【解决方案1】:

你的顺序不好:

在这里,我在 rownames(df) 中依次是你的每个 rown 名称:

for (i in rownames(mtcars)) {
+   print(i)
+ }
[1] "Mazda RX4"
[1] "Mazda RX4 Wag"
[1] "Datsun 710"
...

所以row.names(df)[i] 正在尝试做row.names(df)["yourrowname"] 即:row.names(mtcars)["Mazda RX4"] 返回 NA。

您编写代码的方式,i 必须是一个数字。所以:

for (i in seq_along(rownames(df))) {
  print(i)
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
... 

现在,要替换行名,您需要将 i 放在双括号中。这是 mtcars 的示例:

data("mtcars")
rownames(mtcars)
[1] "Mazda RX4"           "Mazda RX4 Wag"      
[3] "Datsun 710"          "Hornet 4 Drive"     
[5] "Hornet Sportabout"   "Valiant"            
[7] "Duster 360"          "Merc 240D"          
[9] "Merc 230"            "Merc 280"           
[11] "Merc 280C"           "Merc 450SE"         
[13] "Merc 450SL"          "Merc 450SLC"        
[15] "Cadillac Fleetwood"  "Lincoln Continental"

for (i in seq_along(rownames(mtcars))) {

  row.names(mtcars)[[i]] <- gsub(" ", "_", row.names(mtcars)[[i]])
}
rownames(mtcars)

[1] "Mazda_RX4"           "Mazda_RX4_Wag"      
[3] "Datsun_710"          "Hornet_4_Drive"     
[5] "Hornet_Sportabout"   "Valiant"            
[7] "Duster_360"          "Merc_240D"          
[9] "Merc_230"            "Merc_280"           
[11] "Merc_280C"           "Merc_450SE"         
[13] "Merc_450SL"          "Merc_450SLC" 

但正如 cmets 中所述,您在这里不需要 for 循环:

rownames(mtcars) <- gsub(" ", "_", row.names(mtcars))
rownames(mtcars)
[1] "Mazda_RX4"           "Mazda_RX4_Wag"      
[3] "Datsun_710"          "Hornet_4_Drive"     
[5] "Hornet_Sportabout"   "Valiant"            
[7] "Duster_360"          "Merc_240D"          
[9] "Merc_230"            "Merc_280"           
[11] "Merc_280C"           "Merc_450SE"         
[13] "Merc_450SL"          "Merc_450SLC"  

【讨论】:

    猜你喜欢
    • 2011-04-23
    • 2016-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多