我不确定 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] == "十二月",1] 返回:
> x[x[,1] == "december",1]
[1] months value
<0 rows> (or 0-length row.names)
为什么 R 接受对不存在的东西的赋值?我不清楚这种情况下会发生什么,我担心可能会发生一些不可预见的任务或行为。有人可以解释一下吗?
最佳答案
Why does R accept an assignment to something that doesn't exist?
我不知道您还希望看到什么其他行为。如果您想在没有修改任何行时获得提示,一种方法是使用 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
争论。如果您选择使用该软件包,我建议您使用“入门”页面。
关于r - R 中数据的子集化和分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40981741/