2014-01-16 3 views
1

У меня есть кадр данных, df, со следующими столбцами:Вычесть один столбец из другого в кадре данных

> names(df) 
[1] "survived"  "sex"    "age"    
[4] "pclass"   "sibsp"   "predict.t_tree." 

Как сделать поэлементное вычитание predict.t_tree из survived? Было бы неплохо, если бы я мог просто получить результат как массив или что-то еще, а не обновлять сам фрейм данных.

Вот некоторые примеры данных:

> typeof(df$survived) 
[1] "integer" 

> head(df$survived,5) 
[1] 1 1 0 0 0 

> typeof(df$predict.t_tree) 
[1] "integer" 

> head(df$predict.t_tree,5) 
[1] 1 0 1 0 1 
Levels: 0 1 

Следующий код просто выдает ошибку:

> df$survived - df$predict.t_tree 


Warning message: 
In Ops.factor(df$survived, df$predict.t_tree) : - not meaningful for factors 
+0

добавьте некоторые данные вашего файла data.frame. – marbel

+0

Сообщение об ошибке довольно ясно. Один или оба столбца не являются целыми или числовыми и являются фактором. –

+0

спасибо, он думает, что один находится на «уровнях», но все значения являются целыми числами. В любом случае, чтобы изменить его? Используя typeof(), оба столбца кажутся целыми числами, хотя ... – JoeDanger

ответ

0

Давайте посмотрим на выходе:

> typeof(df$survived) 
[1] "integer" 

> head(df$survived,5) 
[1] 1 1 0 0 0 

> typeof(df$predict.t_tree) 
[1] "integer" 

> head(df$predict.t_tree,5) 
[1] 1 0 1 0 1 
Levels: 0 1 <~~~~~ **** NOTICE HERE **** 

Когда вы видите "Levels: ____ " Это говорит о том, что вектор (или column) является «фактором», а не строкой или числом. Если вы ожидаете чего-то иного, кроме factor, тогда вы должны его преобразовать, как правило, с as.character(.). (Будьте очень очень осторожно использовать as.numeric(.) непосредственно на фактор, так как это, скорее всего, не результаты, которые вы будете искать)


После преобразования, парное манипуляция подпруга:

df$predict.t_tree <- as.numeric(as.character(df$predict.t_tree)) 

# Then, this will give you what you are after 
df$survived - df$predict.t_tree 
2

Попробуйте следующее с вашими данными:

as.numeric(as.character(df$survived)) - df$predict.t_tree 

EDIT Добавлено небольшой пример

df <- data.frame(x = c("1", "2", "3"), 
       y = 1:3) 

str(df) 
# 'data.frame': 3 obs. of 2 variables: 
# $ x: Factor w/ 3 levels "1","2","3": 1 2 3 
# $ y: int 1 2 3 

Столбец x имеет типовой коэффициент. Вы должны принуждать тип данных к числовому, чтобы выполнять математические операции.

as.numeric(df$x) - df$y 

This is answered also in the FAQ: 7:10

+1

Это сработало! В чем была проблема?? – JoeDanger

+0

Проблема заключалась в том, что ваши числовые данные в 'survived' были фактически закодированы как фактор, а не число. – amzu

0

df$predict.t_tree был создан как фактор

df$predict.t_tree = as.numeric(as.character(df$predict.t_tree)) 
df$survived - df$predict.t_tree 
+0

Он работает! Благодаря! Зачем нужна функция as.character? – JoeDanger

+0

В вашем случае это, вероятно, не обязательно, так как уровень 0 будет отображать значение 0 и то же самое для 1. Но вам понадобится его, если ваши уровни начнут> 0. –

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