算术数据框和向量

时间:2019-07-25 13:45:10

标签: r dataframe

如果我有一个数据框,请说虹膜,我想减去一个具有相同列名的向量,我该怎么做?

df <- structure(list(Sepal.Length = c(5.1, 4.9, 4.7, 4.6, 5, 5.4), 
    Sepal.Width = c(3.5, 3, 3.2, 3.1, 3.6, 3.9), Petal.Length = c(1.4, 
    1.4, 1.3, 1.5, 1.4, 1.7), Petal.Width = c(0.2, 0.2, 0.2, 
    0.2, 0.2, 0.4)), row.names = c(NA, 6L), class = "data.frame")

vec <- tibble(Sepal.Length = 1, Sepal.Width = 2, Petal.Length = 3, Petal.Width = 4)

我想做这样的事情df - vec

3 个答案:

答案 0 :(得分:2)

一个选项是unlist'vec'。这里的“ vec”是tibble,其中一行。一种方法是使用提供列索引的col复制'vec'以使长度相等。使用该索引,将复制数据集。一旦尺寸相似,就可以进行减法

df - unlist(vec)[col(df)]

或者使用uncount,复制tibble行以获得与'df'相同的尺寸

df - vec %>% 
          uncount(nrow(df))

答案 1 :(得分:2)

或者:

map_dfc(seq_along(colnames(df)), ~df[[.x]] - vec[[.x]])

答案 2 :(得分:1)

如果愿意

df - vec

返回

  

Ops.data.frame(df,vec)中的错误:     “-”仅适用于大小相等的数据帧

所以一种方法是制作大小相等的数据帧并减去

df - vec[rep(nrow(vec), each = nrow(df)), names(df)]

#  Sepal.Length Sepal.Width Petal.Length Petal.Width
#1          4.1         1.5         -1.6        -3.8
#2          3.9         1.0         -1.6        -3.8
#3          3.7         1.2         -1.7        -3.8
#4          3.6         1.1         -1.5        -3.8
#5          4.0         1.6         -1.6        -3.8
#6          4.4         1.9         -1.3        -3.6