R编程:dataframe $ column [<boolean>] = <value>如何工作?

时间:2018-05-28 15:48:29

标签: r dataframe

df = data.frame(c(-2,-1,1,2), NA)
colnames(df) <- c("values", "pos_neg")
flag <- with(df, values < 0)
df$pos_neg[flag] = "negative"
df$pos_neg[!flag] = "positive"

给了我这个

enter image description here

它按预期工作。问题是,我不确定它是如何或为什么这样做的。如果我将一个布尔值放入括号中会发生什么?到目前为止,我认为数据帧是一个数组,我只能按数字(df[1])或名称(如果可用)df["pants"])访问值。

提前致谢!

1 个答案:

答案 0 :(得分:1)

如果您在值不是全部NA后查看子集,则会更容易看到:

df <- data.frame(values = c(-2,-1,1,2), 
                 pos_neg = NA)
flag <- df$values < 0

df$pos_neg[flag] <- "negative"
df$pos_neg[!flag] <- "positive"

这里的第一个重要概念是数据框是变量(“列”)的列表(具有类,一些限制和许多方法,但仍然是列表),而不是二维数组(矩阵) )。因此,$[[子集会提取单个变量,这是一个单一的向量,所以

df$pos_neg
#> [1] "negative" "negative" "positive" "positive"

您可以使用逻辑向量对任何向量进行子集化,因此逻辑子集的工作方式就像c('a', 'b')[c(FALSE TRUE)]一样:

df$pos_neg[flag]
#> [1] "negative" "negative"
df$pos_neg[!flag]
#> [1] "positive" "positive"

使用<-分配给这些子集可以在这里工作,因为您正在提供一个长度为1的向量,该向量将被回收以适合该子集。

在数据框上使用带有两个参数(行和列)的[子集,例如df[2:3, 'values']在某些方面更复杂,即使从矩阵模拟中更直观。特别是,[.data.frame方法默认为drop = TRUE,这可能会使其不清楚是否会返回另一个数据框或向量。大多数情况下这并不重要,但它可能会导致程序化使用中的错误。

在数据框上使用[子集和单个参数,例如df[1],类似于[在列表中执行,按名称,索引或逻辑掩码对列进行子集,并始终返回同一类的另一个列表(即另一个数据帧)。