为什么在我对数据帧进行子集化时返回一个因子?
Why is a factor being returned when I subset a dataframe?
我对 R 编程还是有点陌生。我很困惑为什么将数据框 returns 子集化为一个因子,而不是仅包含单个元素的向量。为什么这是R的默认值?这是因为我要子集化的是一个词,而不是一个值吗?尽管如此,我还是希望有一个字符向量。
例如:
n <- c(2,3,5)
s = c("aa", "bb","cc")
b <- c(TRUE, FALSE, TRUE)
df <- data.frame(n,s,b)
df
test <- df[1,"s"]
test
class(test) #this says it's a factor
谢谢!
默认情况下,data.frame()
函数将字符向量转换为因子。如果您不希望出现这种情况,请使用 data.frame(..., stringsAsFactors=FALSE)
.
另请注意,R 没有 "single values," 它只有向量。即使数字 1
也只是长度为一的数值向量。
参见?data.frame
。 data.frame()
的一项默认设置是将字符向量(例如您的 s = c("aa", "bb","cc")
转换为因子。要更改此设置,您需要将参数 stringsAsFactors
从默认值 TRUE
修改为 FALSE
.
修改代码的方法如下:
n <- c(2,3,5)
s = c("aa", "bb","cc")
b <- c(TRUE, FALSE, TRUE)
df <- data.frame(n,s,b, stringsAsFactors = FALSE)
df
test <- df[1,"s"]
test
class(test) #Now returns character.
事实上 test
不是向量,尽管只有一个元素。它具有属性 levels
,以及将其标识为一个因素的 class
属性。 ?vector
指定:
factors are not vectors
is.atomic
和 is.vector
之间可能会产生混淆,其中后者 returns TRUE
表示除了名称之外没有其他属性的对象。
attributes(test)
$levels
[1] "aa" "bb" "cc"
$class
[1] "factor"
is.atomic(test)
[1] TRUE
length(test)
[1] 1
is.vector(test)
[1] FALSE
问题可能会被退回,因为如果你看到:
sapply(df, class)
n s b
"numeric" "factor" "logical"
为什么 R 应该转换子集对象的 class?使用 test <- df[1,"s"]
你对一个因子进行了子集化,这就是 R 返回给你的。也许有时改变这种行为可能会更好……也许,但想象一下,如果是这种情况,则有必要创建用于更改 class
属性的子集规则。我认为这是一项艰巨的任务。
实际上,我想我找到了我正在寻找的答案,这确实是 为什么 R 数据帧中的字符子集存储为因子,而不是存储为向量的单个元素。意思是,它背后的 目的 ,而不仅仅是它确实如此的事实——这很容易在 ?data.frame()
中看到。
经过一些研究,事实证明这样做的目的实际上是为了防止在统计分析中以错误的方式应用名义(分类,非序数)数据(例如,它不会更多 的标称值有意义 - 改变颜色不是 更多 的东西,只是名义上的不同。
这个网站真的帮我解决了这个问题:http://www.stat.berkeley.edu/~s133/factors.html
感谢您的回复!
我对 R 编程还是有点陌生。我很困惑为什么将数据框 returns 子集化为一个因子,而不是仅包含单个元素的向量。为什么这是R的默认值?这是因为我要子集化的是一个词,而不是一个值吗?尽管如此,我还是希望有一个字符向量。
例如:
n <- c(2,3,5)
s = c("aa", "bb","cc")
b <- c(TRUE, FALSE, TRUE)
df <- data.frame(n,s,b)
df
test <- df[1,"s"]
test
class(test) #this says it's a factor
谢谢!
默认情况下,data.frame()
函数将字符向量转换为因子。如果您不希望出现这种情况,请使用 data.frame(..., stringsAsFactors=FALSE)
.
另请注意,R 没有 "single values," 它只有向量。即使数字 1
也只是长度为一的数值向量。
参见?data.frame
。 data.frame()
的一项默认设置是将字符向量(例如您的 s = c("aa", "bb","cc")
转换为因子。要更改此设置,您需要将参数 stringsAsFactors
从默认值 TRUE
修改为 FALSE
.
修改代码的方法如下:
n <- c(2,3,5)
s = c("aa", "bb","cc")
b <- c(TRUE, FALSE, TRUE)
df <- data.frame(n,s,b, stringsAsFactors = FALSE)
df
test <- df[1,"s"]
test
class(test) #Now returns character.
事实上 test
不是向量,尽管只有一个元素。它具有属性 levels
,以及将其标识为一个因素的 class
属性。 ?vector
指定:
factors are not vectors
is.atomic
和 is.vector
之间可能会产生混淆,其中后者 returns TRUE
表示除了名称之外没有其他属性的对象。
attributes(test)
$levels
[1] "aa" "bb" "cc"
$class
[1] "factor"
is.atomic(test)
[1] TRUE
length(test)
[1] 1
is.vector(test)
[1] FALSE
问题可能会被退回,因为如果你看到:
sapply(df, class)
n s b
"numeric" "factor" "logical"
为什么 R 应该转换子集对象的 class?使用 test <- df[1,"s"]
你对一个因子进行了子集化,这就是 R 返回给你的。也许有时改变这种行为可能会更好……也许,但想象一下,如果是这种情况,则有必要创建用于更改 class
属性的子集规则。我认为这是一项艰巨的任务。
实际上,我想我找到了我正在寻找的答案,这确实是 为什么 R 数据帧中的字符子集存储为因子,而不是存储为向量的单个元素。意思是,它背后的 目的 ,而不仅仅是它确实如此的事实——这很容易在 ?data.frame()
中看到。
经过一些研究,事实证明这样做的目的实际上是为了防止在统计分析中以错误的方式应用名义(分类,非序数)数据(例如,它不会更多 的标称值有意义 - 改变颜色不是 更多 的东西,只是名义上的不同。
这个网站真的帮我解决了这个问题:http://www.stat.berkeley.edu/~s133/factors.html
感谢您的回复!