2016-08-08 6 views
1

Я первый таймер, так любезно простите за любые упущения/ошибки (пожалуйста, дайте обратную связь, хотя :)R кадр данных манипуляции/transfomation с использованием ldply

Я пытаюсь написать некоторый R код, который будет принимать набор диафрагмы и сделать лог-преобразование числовых столбцов в соответствии с некоторым критерием, скажем, если асимметрия> 0,2. Я попытался использовать ldply, но это не совсем дает мне результат, который я хочу. Это дает мне транспонированный фрейм данных, имена переменных отсутствуют, а записи с нечисловыми столбцами перепутаны.

Перед отправкой на этот вопрос я искал и нашел следующие темы, связанные, но не вполне отвечают, что именно я искал

Selecting only numeric columns from a data frame

extract only numeric columns from data frame данных

Ниже приведен код. Цените помощь!

data(iris) 
df <- iris 
df <- ldply(names(df), function(x) 
    { 
    if (class(df[[x]])=="numeric") 
    { 
    tmp <- df[[x]][!is.na(df[[x]])] 
    if (abs(skewness(tmp)) > 0.2) 
     { 
     df[[x]] <- log10(1 + df[[x]] ) 
     } 
    else df[[x]] <- df[[x]] 
    } 
    else df[[x]] <- df[[x]] 
    #df[[x]] <- data.frame(df[[x]]) 
    #df2 <- cbind(df2, df[[x]]) 
    #return(NULL) 
    } 
) 
+0

Вам может не понадобиться 'ldply', использовать опции' lapply' и другие базовые R. Из какого пакета вы получили «асимметрию»? – akrun

ответ

0

Попробуйте с lapply:

#Skewness package 
library(e1071) 

lapply(iris, function(x) { 
     if(is.numeric(x)){ 
      if(abs(skewness(x, na.rm = T))>0.2){ 
      log10(1 + x)} else x 
      } 
    else x 
    }) 
+0

Спасибо. Я думал, что взамен использует только списки в качестве входных данных, похоже, что он может принимать и фрейм данных. Может быть, он принуждает его к списку? – Vaidy

0

Мы можем использовать lapply

library(e1071) 
lapply(iris, function(x) if(is.numeric(x) & abs(skewness(x, na.rm = TRUE)) > 0.2) 
         log10(1+x) else x) 

Мы можем также цикл по столбцам интереса после создания логического индекса

i1 <- sapply(iris, is.numeric) 
i2 <- sapply(iris[i1], function(x) abs(skewness(x, na.rm = TRUE)) > 0.2) 
iris[i1][i2] <- lapply(iris[i1][i2], function(x) log10(1+x))