gpt4 book ai didi

r - data.frame(tag=value, ...) 的意外行为

转载 作者:行者123 更新时间:2023-12-04 21:16:47 24 4
gpt4 key购买 nike

根据 data.frame(...) 的文档, ...参数具有以下形式:

... these arguments are of either the form value or tag = value. 
Component names are created based on the tag (if present) or
the deparsed argument itself.


考虑一个包含三列的数据框:a、b、c
DF <- data.frame(a=1:10, b=letters[1:10], c=rnorm(10))

现在考虑这三种创建新数据框的可能性
newDF <- data.frame(x=DF$a)
colnames(newDF) # as expected...
# [1] "x"
newDF <- data.frame(x=DF["a"])
colnames(newDF) # Huh??
# [1] "a"
newDF <- data.frame(x=DF[["a"]])
colnames(newDF) # Why is this necessary??
# [1] "x"

查看每个 RHS 的类:
class(DF$a)
# [1] "integer"
class(DF["a"])
# [1] "data.frame"
class(DF[["a"]])
# [1] "integer"

看来,如果 RHS 是一个 data.frame,那么 tagvalue 的名称覆盖.

另外,考虑这个稍微复杂一点的例子,由 this question 提示。 :
library(xts)
data(sample_matrix)
xtsObject=as.xts(sample_matrix)
head(xtsObject,1)
# Open High Low Close
# 2007-01-02 50.03978 50.11778 49.95041 50.11778
newDF <- data.frame(x=xtsObject$Open) # would have expected this to work
colnames(newDF) # alas, no...
# [1] "Open"
class(xtsObject$Open)
# [1] "xts" "zoo"

所以我的问题是 : 使用时的规则是什么 data.frame(tag=value,...) ?也就是说,我什么时候可以期望结果有一个名为 "tag" 的列? ?

最佳答案

tl;博士 : 如果对象提供给 data.frame未命名,结果将具有标签的名称。

让我们调用可选参数 data.frame数据。 data.frame首先创建一个提供给它的数据列表。然后该函数循环遍历列表的每个元素。如果列表的元素有名字,data.frame保留那个名字。从技术上讲,它会检查是否 length(names(data[[i]])) > 0对于每个元素,i , 提供给函数的数据列表。仅当该元素没有名称时,data.frame使用 tag作为名字。

回到你的例子,考虑从 DF 派生的参数名称。提供给 data.frame :

names(DF$a)
# NULL
names(DF['a'])
# [1] "a"
names(DF[['a']])
# NULL

请注意,在第一种和第三种情况下, names(...)NULL .这就是为什么 data.frame(x = DF$a)data.frame(x = DF[['a']])具有预期名称: x .

对于更复杂的 xts对象,但是,请注意来自 $ 的子集操作的结果对象有一个名字:
names(xtsObject$Open)
#"Open"
names(xtsObject[, 'Open'])
#"Open"

因此,在任何一种情况下,数据框都是使用 data.frame(x=xtsObject[, 'Open']) 创建的。或 data.frame(x=xtsObject$Open)将有名称 Open .

这是在 data.frame 中设置名称的相关代码.请注意 xlist(...)哪里 ...是数据。
for (i in seq_len(n)) {
xi <- if (is.character(x[[i]]) || is.list(x[[i]]))
as.data.frame(x[[i]], optional = TRUE, stringsAsFactors = stringsAsFactors)
else as.data.frame(x[[i]], optional = TRUE)
nrows[i] <- .row_names_info(xi)
ncols[i] <- length(xi)
namesi <- names(xi)
if (ncols[i] > 1L) {
if (length(namesi) == 0L)
namesi <- seq_len(ncols[i])
if (no.vn[i])
vnames[[i]] <- namesi
else vnames[[i]] <- paste(vnames[[i]], namesi, sep = ".")
}
else {
if (length(namesi))
vnames[[i]] <- namesi
else if (no.vn[[i]]) {
tmpname <- deparse(object[[i]])[1L]
if (substr(tmpname, 1L, 2L) == "I(") {
ntmpn <- nchar(tmpname, "c")
if (substr(tmpname, ntmpn, ntmpn) == ")")
tmpname <- substr(tmpname, 3L, ntmpn - 1L)
}
vnames[[i]] <- tmpname
}
}
if (mirn && nrows[i] > 0L) {
rowsi <- attr(xi, "row.names")
nc <- nchar(rowsi, allowNA = FALSE)
nc <- nc[!is.na(nc)]
if (length(nc) && any(nc))
row.names <- data.row.names(row.names, rowsi,
i)
}
nrows[i] <- abs(nrows[i])
vlist[[i]] <- xi
}

关于r - data.frame(tag=value, ...) 的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21413322/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com