此
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"
给了我这个
它按预期工作。问题是,我不确定它是如何或为什么这样做的。如果我将一个布尔值放入括号中会发生什么?到目前为止,我认为数据帧是一个数组,我只能按数字(df[1]
)或名称(如果可用)df["pants"]
)访问值。
提前致谢!
答案 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]
,类似于[
在列表中执行,按名称,索引或逻辑掩码对列进行子集,并始终返回同一类的另一个列表(即另一个数据帧)。