【问题标题】:In "R" iterate over specific columns在“R”中迭代特定列
【发布时间】:2015-03-14 03:39:56
【问题描述】:

更新:感谢 jason 和 Buckminster - 我使用了您的建议的变体

我使用了以下然后调整了我的功能/数据再次感谢

myFun<-function(x) {

        myDF$multiple[grep(" Mbps",myDF[,x])] <- 1000000
        myDF[,x] <- gsub(" Mbps","",myDF[,x]) 

        myDF$multiple[grep(" Kbps",myDF[,x])] <- 1000
        myDF[,x] <- gsub(" Kbps","",myDF[,x]) 

        myDF$multiple[grep(" bps",myDF[,x])] <- 1 
        myDF[,x] <- gsub(" bps","",myDF[,x])

        myDF[,x] <- as.numeric(myDF[,x]) * myDF$multiple

}

cols<-c('MaximumIn','MaximumOut','AverageIn','AverageOut')
myDF[ ,2:5]<-lapply(cols,myFun)

使用 dput() 更新。我要感谢您的回复,并意识到我本可以更轻松地获得帮助。我不得不返回并清理数据并使数据变小,以便我可以 dput()。


我想创建一种优化的方法来迭代我关心的 4 列,可能使用 lappy。

下面是我的几行数据,有 6 列,我只想操作第 2-5 列。此 sn-p 已使用我认为与我的问题无关的其他代码进行了处理。

Host      MaximumIn     MaximumOut  AverageIn   AverageOut  Site Name   Date
device1   30.63 Kbps    0 bps       24.60 Kbps  0 bps       SiteA       3/7/15
device12  1.13 Mbps     24.89 Kbps  21.76 Kbps  461 bps     SiteA       3/8/15
device1   698.44 Kbps   37.71 Kbps  17.49 Kbps  3.37 Kbps   SiteB       3/7/15

这是数据帧的 deput() 参见上面的 sn-p。我有一个 .csv 文件 dput() 但还没有看到如何将它上传到这个问题。

structure(list(Host = structure(c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 
7L, 8L, 9L, 10L), .Label = c("DeviceS1", "DeviceS2", "DeviceS3", 
"DeviceS4", "DeviceS5", "deviceS2a", "deviceS2b", "devices5a", 
"devices5b", "devices5c"), class = "factor"), MaximumIn = structure(c(5L, 
2L, 3L, 1L, 4L, 6L, 7L, 8L, 11L, 10L, 9L), .Label = c("121.02 Kbps", 
"27.11 Kbps", "39.08 Kbps", "62.22 Kbps", "698.44 Kbps", "1.21 Mbps", 
"3.52 Mbps", "606.44 Kbps", "16.19 Mbps", "34.04 Mbps", "34.21 Mbps"
), class = "factor"), MaximumOut = structure(c(5L, 1L, 2L, 4L, 
3L, 6L, 7L, 8L, 9L, 11L, 10L), .Label = c("0 bps", "10.58 Kbps", 
"18.94 Kbps", "33.26 Kbps", "37.71 Kbps", "4.08 Mbps", "405.38 Kbps", 
"930.44 Kbps", "15.35 Mbps", "192.88 Kbps", "2.98 Mbps"), class = "factor"), 
    AverageIn = structure(c(4L, 2L, 1L, 5L, 3L, 8L, 7L, 6L, 10L, 
    9L, 11L), .Label = c("10.83 Kbps", "24.57 Kbps", "3.87 Kbps", 
    "30.36 Kbps", "9.76 Kbps", "170.21 Kbps", "210.04 Kbps", 
    "312.39 Kbps", "20.08 Mbps", "21.60 Mbps", "5.95 Mbps"), class =     "factor"), 
    AverageOut = structure(c(5L, 1L, 4L, 3L, 2L, 8L, 7L, 6L, 
    11L, 10L, 9L), .Label = c("0 bps", "1.54 Kbps", "2.28 Kbps", 
    "5.01 Kbps", "5.08 Kbps", "124.78 Kbps", "26.42 Kbps", "599.09 Kbps", 
    "21.38 Kbps", "576.77 Kbps", "6.16 Mbps"), class = "factor"), 
    `Site Name` = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 
    3L, 3L, 3L), .Label = c("site1", "site2", "site5"), class = "factor"), 
    Date = structure(c(16475, 16475, 16475, 16475, 16475, 16476, 
    16476, 16476, 16476, 16476, 16476), class = "Date")), .Names = c("Host", 
"MaximumIn", "MaximumOut", "AverageIn", "AverageOut", "Site Name", 
"Date"), row.names = c(NA, 11L), class = "data.frame")

在下面的代码中,我手动编辑然后运行每一列(MaximumIn、MaximumOut、AverageIn、AverageOut)。我所做的工作但不符合 R(任何语言)的简洁标准。那么下面是基于列的函数的候选吗?

myDF$multiple <- 1

myDF$multiple[grep(" Mbps",myDF$MaximumOut)] <- 1000000
myDF$MaximumOut <- gsub(" Mbps","",myDF$MaximumOut) 

myDF$multiple[grep(" Kbps",myDF$MaximumOut)] <- 1000
myDF$MaximumOut <- gsub(" Kbps","",myDF$MaximumOut) 

myDF$multiple[grep(" bps",myDF$MaximumOut)] <- 1 
myDF$MaximumOut <- gsub(" bps","",myDF$MaximumOut)

myDF$MaximumOut <- as.numeric(myDF$MaximumOut) * myDF$multiple

【问题讨论】:

  • 定义一个函数来执行你想要的操作,然后myDF[ ,2:5] &lt;- lapply(myDf[ ,2:5], yourFunction)
  • 对,我有点卡住的地方是例如将 myDF$MaximumIn 变成 myDF$MaximumOut,然后是 myDF$AverageIn,最后是 myDF$AverageOut。不确定这是否有意义。我想将列名发送到函数中,以便我可以执行 grep。谢谢你这么快回复:)
  • dput数据。
  • @Metrics 你想让我输入(myDF)意思是我的数据框然后粘贴到这里?
  • 如果你想将列名发送到函数中,那么简单:myFun

标签: r loops for-loop rstudio lapply


【解决方案1】:

这看起来很简单。我没有测试,因为我们没有得到数据,但你应该明白要点。

myFun<-function(col) {

    myDF$multiple[grep(" Mbps",myDF[,col])] <- 1000000
    myDF[,col] <- gsub(" Mbps","",myDF[,col]) 

    myDF$multiple[grep(" Kbps",myDF[,col])] <- 1000
    myDF[,col] <- gsub(" Kbps","",myDF[,col]) 

    myDF$multiple[grep(" bps",myDF[,col])] <- 1 
    myDF[,col] <- gsub(" bps","",myDF[,col])

    myDF[,col] <- as.numeric(myDF[,col]) * myDF$multiple

}

cols<-c('MaximumOut','AverageIn','AverageOut','MaximumIn')
lapply(cols,myFun)

【讨论】:

  • 感谢您的回复。我知道我的尝试失败了,我会试试你的。您知道我是否可以上传包含此问题测试数据的 .csv 文件?我想让它更“可复制”。我粘贴了上面的 dput() 文本。我不得不修改我的数据集,因为它不是公共数据,并使其足够小,不会成为负担。
  • 再次感谢 - 我如何使用函数的输出来更新原始数据框 (myDF)。如果你愿意的话,这就是我被困住的地方。
  • 谢谢 Jason 和 Buckminster:我使用了您的建议并使用测试和实时数据完成了测试。感谢您的回复
猜你喜欢
  • 1970-01-01
  • 2015-12-29
  • 2021-06-20
  • 2014-12-29
  • 1970-01-01
  • 2021-02-07
  • 1970-01-01
  • 2018-03-02
相关资源
最近更新 更多