【问题标题】:How to replace matching with value from next column in r如何用r中下一列的值替换匹配
【发布时间】:2016-07-24 11:47:00
【问题描述】:

我有一个数据框:

structure(list(City = structure(c(4L, 2L, 1L, 3L, 3L, 3L), .Label = c("Gold Cost", 
"Melbourne", "Other", "Sydney"), class = "factor"), Town = structure(c(1L, 
1L, 1L, 3L, 4L, 2L), .Label = c("", "Brighton", "Hurstville", 
"Penhurst"), class = "factor")), .Names = c("City", "Town"), class = "data.frame", row.names = c(NA, 
-6L))

我想替换名为 City 的列中包含名为 Other 的值的所有行,并将其替换为同一行的下一列中的值。

我的输出应该是这样的:

structure(list(City = structure(c(6L, 4L, 2L, 3L, 5L, 1L), .Label = c("Brighton", 
"Gold Cost", "Hurstville", "Melbourne", "Penhurst", "Sydney"), class = "factor"), 
    Town = structure(c(1L, 1L, 1L, 3L, 4L, 2L), .Label = c("", 
    "Brighton", "Hurstville", "Penhurst"), class = "factor")), .Names = c("City", 
"Town"), class = "data.frame", row.names = c(NA, -6L))

我之前没有写过任何函数,但我猜它应该是这样的:

for(data1 in 1:nrow(data1)) {
        if(data1$City[i] == 'Other') {
                data1$city[i] <- data1$Town[i]
        } else {
                break
        }
}
  1. 我哪里出错了?
  2. 未来解决此类问题的思考过程应该是什么?
  3. 我怎样才能得到想要的结果?

【问题讨论】:

    标签: r


    【解决方案1】:

    有2个错误和2个低效。

    错误 1: 你写的是for(data1 而不是for(i

    错误 2: 你的班级是 factor for City,你正在尝试添加新的关卡。而是将此操作更改为character。否则,新的因子水平将转换为NA。还有其他方法可以解决此问题,但效率较低;之后您可以随时将其改回因子。

    效率低下 1: 您也不需要else 语句。

    效率低下 2:如果没有 for 循环(即以矢量化方式),您可以做到这一点。

    data1 <- structure(list(City = structure(c(4L, 2L, 1L, 3L, 3L, 3L), 
    .Label = c("Gold Cost", "Melbourne", "Other", "Sydney"), class = "factor"), 
                            Town = structure(c(1L, 1L, 1L, 3L, 4L, 2L),
     .Label = c("", "Brighton", "Hurstville", "Penhurst"), class = "factor")), 
                       .Names = c("City", "Town"), class = "data.frame",
       row.names = c(NA, -6L))
    
    desired_output <- structure(list(City = structure(c(6L, 4L, 2L, 3L, 5L, 1L),
     .Label = c("Brighton", "Gold Cost", "Hurstville", "Melbourne", "Penhurst", "Sydney"),
      class = "factor"), Town = structure(c(1L, 1L, 1L, 3L, 4L, 2L), 
     .Label = c("", "Brighton", "Hurstville", "Penhurst"), class = "factor")), 
      .Names = c("City", "Town"), class = "data.frame",
     row.names = c(NA, -6L))
    
    data1$City <- as.character(data1$City)
    data1$Town <- as.character(data1$Town)
    for(i in 1:nrow(data1)){
      if(data1$City[i]=='Other'){
        data1$City[i]<- data1$Town[i]
      }
    }
    
    data1
    
            City       Town
    1     Sydney           
    2  Melbourne           
    3  Gold Cost           
    4 Hurstville Hurstville
    5   Penhurst   Penhurst
    6   Brighton   Brighton
    
    data1 == desired_output
    
         City Town
    [1,] TRUE TRUE
    [2,] TRUE TRUE
    [3,] TRUE TRUE
    [4,] TRUE TRUE
    [5,] TRUE TRUE
    [6,] TRUE TRUE
    

    现在是矢量化解决方案。通过避免使用循环,您的代码运行速度将呈指数级增长,而且您还必须输入更少的代码。

    data1$City[data1$City == "Other"] <- data1$Town[data1$City == "Other"]
    

    【讨论】:

    • 啊哈!非常感谢@Hack-R 的帮助。
    猜你喜欢
    • 2019-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    • 1970-01-01
    • 2017-07-19
    • 1970-01-01
    相关资源
    最近更新 更多