2015-06-08 5 views
-1

мне нужно классифицировать строки на две группы (Present или Not present) на основе значений в двух столбцах Var1, Var2 в dataframe pum. Позже добавьте это как новый столбец в другой фрейм данных как data.cov.cat$PU. Когда Var1 более 0.053 или Var2 в наборе значений c(1,2,3), строки должны быть обозначены как Present еще Not present.Преодолеть принуждение dataframe к списку при использовании sqldf

Нижеприведенный фрагмент кода разработан на условиях.

data.cov.cat$PU <- sqldf("SELECT CASE WHEN Var1 >= 0.053 THEN 'Present' 
            WHEN Var1 < 0.053 OR Var2 IN (1,2,3) THEN 'Present' 
            WHEN Var1 < 0.053 OR Var2 = 0 THEN 'Not present' 
            ELSE 'NA' 
           END as newCol 
           FROM pum")$newCol 

Команда выполняет правильно и вывод, как ожидается, за исключением dataframe data.cov.cat принуждается к списку.

Не могли бы вы предложить, как избежать обратного преобразования данных в список.

Возпроизводимо пример:

data.cov.cat <- data.frame(V1 = runif(10,0,10), V12 = c("blue", "red", "yellow", "pink","blue", "red", "yellow", "pink", "red", "yellow")) 

data.cov.cat <- sapply(data.cov.cat, as.factor) 

pum <- data.frame(Var1 = runif(10,0,1), Var2 = c(1,3,2,0,2,1,2,0,1,3)) 

data.cov.cat$PU <- sqldf("SELECT CASE WHEN Var1 >= 0.053 THEN 'Present' 
            WHEN Var1 < 0.053 OR Var2 IN (1,2,3) THEN 'Present' 
            WHEN Var1 < 0.053 OR Var2 = 0 THEN 'Not present' 
            ELSE 'NA' 
           END as newCol 
           FROM pum")$newCol 

Как оригинальный data.frame имеет столбцы разложено, я преобразуя их здесь.

+1

Какой «data.frame» преобразован в «список» - «pum» или «data.cov.cat»? Не могли бы вы предоставить образец данных, который воспроизводит проблему? –

+0

@alexis_laz Я добавил пример, не могли бы вы взглянуть на него. – Prradep

+1

Даже с редактированием он все еще не воспроизводится, так как отсутствует data.cov.cat. Также, если вы собираетесь использовать случайные числа, необходимо сделать заявление 'set.seed', чтобы сделать его воспроизводимым. Выход из 'sqldf (...) $ newCol' является символьным вектором, как ожидалось, но мы не можем больше говорить на основе предоставленной информации. –

ответ

2

data.cov.cat не является фреймворком данных до выполнения последней инструкции sqldf. Он был изменен на матрицу, когда sapply был исполнен. Решением воспроизводимого примера является:

data.cov.cat <- data.frame(V1 = runif(10,0,10), V12 = c("blue", "red", "yellow", "pink","blue", "red", "yellow", "pink", "red", "yellow")) 

data.cov.cat <- as.data.frame(sapply(data.cov.cat, as.factor)) 

pum <- data.frame(Var1 = runif(10,0,1), Var2 = c(1,3,2,0,2,1,2,0,1,3)) 

data.cov.cat$PU <- sqldf("SELECT CASE WHEN Var1 >= 0.053 THEN 'Present' 
            WHEN Var1 < 0.053 OR Var2 IN (1,2,3) THEN 'Present' 
            WHEN Var1 < 0.053 OR Var2 = 0 THEN 'Not present' 
            ELSE 'NA' 
           END as newCol 
           FROM pum")$newCol 

Теперь это принуждение не сталкивается.