2015-03-14 3 views
0

Update: Спасибо Ясон и Buckminster - я использовал изменение ваших предложенийВ «R» перебрать определенные столбцы

я использовал ниже, то с поправкой на мои функции/данные Снова благодаря

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().


Я хотел бы создать оптимизированный способ перебора четырех столбцов, о которых я забочусь, возможно, используя lappy.

Ниже приведены несколько строк моих данных с 6 столбцами, я только хочу манипулировать столбцами 2-5. Этот фрагмент был обработан с помощью другого кода, который, я думаю, не связан с моим вопросом.

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 

Здесь находится заместитель() данных, см. Фрагмент выше. У меня есть файл .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 
+0

Определить функцию, которая выполняет манипуляции вы хотите, и затем 'myDF [, 2: 5] <- lapply (myDf [, 2: 5], yourFunction)' –

+0

справа, где я немного застрял on, например, делает myDF $ MaximumIn в myDF $ MaximumOut, тогда myDF $ AverageIn и, наконец, myDF $ AverageOut. Не уверен, что это имеет смысл. Я хочу отправить имя столбца в функцию, чтобы я мог делать grep. Спасибо за ответ так быстро :) – JohnP

+0

Пожалуйста, 'dput' данные. – Metrics

ответ

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) 
+0

Спасибо за ваш ответ. Я вижу, где моя попытка провалилась, я попробую. Вы знаете, могу ли я загрузить CSV-файл с тестовыми данными для этого вопроса? Я хочу сделать его более «воспроизводимым». Я вставил текст dput() выше. Мне пришлось изменить свой набор данных, потому что это не общедоступные данные и сделать его достаточно маленьким, чтобы не быть бременем. – JohnP

+0

еще раз спасибо - как я могу использовать выход функции для обновления исходного фрейма данных (myDF). Вот где я застрял, если захочешь. – JohnP

+0

Спасибо Джейсон и Бакминстер: Я использовал оба ваши предложения и завершил тестирование с помощью тестовых и живых данных. Я ценю ваши ответы – JohnP

Смежные вопросы