在数据框中从另一列中减去一列

时间:2014-01-16 22:08:52

标签: r dataframe

我有一个数据框df,其中包含以下列:

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

如何从predict.t_treesurvived进行逐元素减法?如果我可以将结果作为数组或其他东西并且不更新数据框本身,那将是很好的。

以下是一些示例数据:

> 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

3 个答案:

答案 0 :(得分:2)

请尝试以下数据:

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

修改 添加了一个小例子

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 :(得分:0)

df$predict.t_tree被创建为因子

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

答案 2 :(得分: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: ____ "时,它告诉您向量(或列)是'因子'而不是字符串或数字。如果您期望的不是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