在R中对数据进行子集和分配

时间:2016-12-05 19:20:53

标签: r dataframe subset variable-assignment

我不确定R中特定类型的数据子集和赋值会发生什么。

假设我有一个两列数据框,其中第一列是一个月的名称,第二列是一些数据。我将在这里做一个简单的例子,但我工作的数据帧中的实际行要大得多。

x <- data.frame(c("october", "march", "february", "january"), rnorm(4), 
stringsAsFactors = FALSE)
names(x) <- c("months", "value")

以下列方式对数据进行子集化和设置是否安全?:

x[x[,1] == "october",1] <- "01/10"

我问这个是因为我不完全理解在第一列中没有匹配的情况下会发生什么,例如:

x[x[,1] == "december",1] <- "01/12"

x [x [,1] ==“december”,1]返回:

> x[x[,1] == "december",1]
[1] months value 
<0 rows> (or 0-length row.names)

为什么R接受对不存在的东西的赋值?我不清楚在这种情况下会发生什么,我担心一些不可预见的任务或行为可能会发生。有人可以对此有所了解吗?

1 个答案:

答案 0 :(得分:2)

  

为什么R接受对不存在的东西的赋值?

我不知道您希望看到的其他行为。如果你想在没有修改行的情况下进行抬头,那么一种方法是使用data.table:

library(data.table)
setDT(x)

x[ months == "december", months := "01/12", verbose = TRUE ]

给出了......

Creating new index 'months'
Starting bmerge ...done in 0.02 secs
Detected that j uses these columns: months 
No rows match i. No new columns to add so not evaluating RHS of :=
Assigning to 0 row subset of 4 rows

请注意,最后两行告诉您没有修改任何行。

如果您以某种方式将此控制台输出写入文本文件日志,则可以扫描它以确定是否存在与“分配到0行子集”匹配的任何实例。也可以通过像Jan Gorecki's dtq这样的“审核”包修改行来获取统计信息。

此语法的工作原理:

the data.table package的语法是DT[where, select|update|do, by]。在这种情况下,我们正在进行“更新”并跳过by参数。如果您选择使用该软件包,我建议您使用“使用入门”页面。