列出函数中的因素但 return 警告错误
Making list of factors in a function but return warning error
假设我有这些向量:
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) 有没有其他方法可以获得函数中的因子列表?
解决方法很简单,只需要在 "Factors" 周围加双括号 :)
函数中
result[["Factors"]] <- unique(dataset[[3]])
应该是这条线。
双括号return一个元素,单括号return表示选择一个列表。
听起来很傻,试试这个
test <- list()
class(test["Factors"])
class(test[["Factors"]])
第一个 class 类型为 'list'。第二个将是 'NULL' 类型。这是因为单括号 return 是作为列表的子集,而双括号 return 是元素本身。根据场景,它很有用。本例中的元素是 "NULL",因为尚未为其分配任何内容。
错误 "number of items to replace is not a multiple of replacement length" 是因为您要求它将 3 个东西放入单个元素(该元素是一个列表)。当你使用双括号时,你实际上把它放在一个列表中,你可以在列表中有多个元素,所以它可以工作!
希望这是有道理的!
目前,当您创建数据框时,dataset$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]]
调用
假设我有这些向量:
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) 有没有其他方法可以获得函数中的因子列表?
解决方法很简单,只需要在 "Factors" 周围加双括号 :)
函数中
result[["Factors"]] <- unique(dataset[[3]])
应该是这条线。
双括号return一个元素,单括号return表示选择一个列表。
听起来很傻,试试这个
test <- list()
class(test["Factors"])
class(test[["Factors"]])
第一个 class 类型为 'list'。第二个将是 'NULL' 类型。这是因为单括号 return 是作为列表的子集,而双括号 return 是元素本身。根据场景,它很有用。本例中的元素是 "NULL",因为尚未为其分配任何内容。
错误 "number of items to replace is not a multiple of replacement length" 是因为您要求它将 3 个东西放入单个元素(该元素是一个列表)。当你使用双括号时,你实际上把它放在一个列表中,你可以在列表中有多个元素,所以它可以工作!
希望这是有道理的!
目前,当您创建数据框时,dataset$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]]