假设我有这些载体:
time <- c(306,455,1010,210,883,1022,310,361,218,166)
status <- c(1,1,0,1,1,0,1,1,1,1)
gender <- c(1,1,1,1,1,1,2,2,1,1)
我把它变成了这些数据框:
dataset <- data.frame(time, status, gender)
我想用这个函数列出第三列中的因子(p / s:原谅不成熟。我还在学习):
getFactor<-function(dataset){
result <- list()
result["Factors"] <- unique(dataset[[3]])
return(result)
}
我得到的就是这个:
getFactor(dataset)
$Factors
[1] 1
Warning message:
In result["Factors"] <- unique(dataset[[3]]) :
number of items to replace is not a multiple of replacement length
我尝试使用levels
,但我得到的只是一个空列表。我的问题是(1)为什么会发生这种情况? (2)有没有其他方法可以获得函数中的因子列表?
答案 0 :(得分:1)
解决方案很简单,你只需要围绕“因素”的双括号:)
在功能
中result[["Factors"]] <- unique(dataset[[3]])
那应该就行了。
双括号返回一个元素,单括号将该选择作为列表返回。
听起来很傻,试试这个
test <- list()
class(test["Factors"])
class(test[["Factors"]])
第一个类的类型为'list'。第二个是'NULL'类型。这是因为单个括号返回一个子集作为列表,双括号返回元素本身。根据场景,它很有用。在这种情况下,元素是“NULL”,因为没有为它分配任何内容。
错误“要替换的项目数不是替换长度的倍数”是因为您已经要求它将3个东西放入一个元素(该元素是一个列表)。当你使用双括号时,你实际上把它放在一个列表中,你可以在那里有多个元素,所以它可以工作!
希望有意义!
答案 1 :(得分:0)
目前,当您创建数据框时,数据集$ gender是双向量(如果其中的所有内容都是数字,则R将自动执行)。如果你想让它成为一个因素,你可以在开头就这样说:
dataset <- data.frame(time, status, gender = as.factor(gender))
或者强迫它成为一个因素:
dataset$gender <- as.factor(gender)
然后获得级别的向量很简单,无需编写函数:
level_vector <- levels(dataset$gender)
level_vector
你也是列表和分类的子集。您的函数中的数据框不正确。要调用数据集的第三列,请使用dataset[,3]
。列表的第一个元素由list[[1]]