我正在尝试集成2个功能。 第一个是检查变量是否为哑 第二个适用于数据框并根据每列的值返回打印语句(虚拟或非虚拟)。 虚函数适用于单个变量(例如df $ var1),但是当我尝试在数据帧上使用第二个时,它表明所有变量都是虚拟的。 这里是代码
一些随机生成的数据
level=c("Strongly Agree", "Agree", "Neither agree or disagree","Disagree", "Strongly disagree",NA)
df <- data.frame(pre_1=as.character(sample(c("Yes","No", NA), 20, replace = T)),
pre_2=as.character(sample(level, 20, replace = T)),
post_1=as.character(sample(level, 20, replace = T)),
post_2=as.character(sample(level, 20, replace = T)),
stringsAsFactors=T)
这里是虚函数
dummy <- function(v, naVal = NULL) {
v1 <- na.omit(v)
# remove NA's
v2 <- as.integer(as.factor(v1))
if( !is.numeric(v2) ) stop("Only numeric vectors are accepted.")
# get unique values
v_unique <- unique(v2)
# remove 'naVal's
v_unique2 <- v_unique[! v_unique %in% naVal]
# count number of unique values and check whether all values are integers
if ( length(unique(v_unique2)) > 2L ||
any(as.integer(v_unique2) != v_unique2) ) FALSE else TRUE
}
这里是df的打印功能
data_dummy <- function(df) {
df = select(df, starts_with("pre_"))
for (i in 1:ncol(df)){
if (dummy(as.character(df[i]))==TRUE) {print ("dummy")}
else {print ("not dummy")}}
}
期望值应为1“虚拟”1“非虚拟”。 现实:
[1] "dummy"
[1] "dummy"
答案 0 :(得分:1)
这是一个非常常见的错误,如果事情没有按照你期望的方式工作,那么请注意这个错误。当您希望提取向量时,使用[i]
提取数据框。要提取矢量,请使用$name
或[[i]]
。这是需要更改最少字符的修复:
data_dummy <- function(df) {
df = select(df, starts_with("pre_"))
for (i in 1:ncol(df)){
if (dummy(as.character(df[[i]]))==TRUE) {print ("dummy")}
else {print ("not dummy")}}
data_dummy(df)
# [1] "dummy"
# [1] "not dummy"
但是,如果您想练习防御性编程,请避免使用括号来提取。这可以防止不可避免的拼写错误,而且我认为这也使它更具可读性。如果要循环遍历数据框的列,请执行此操作。特别注意for (col in df)
data_dummy <- function(df) {
df = select(df, starts_with("pre_"))
for (col in df){
if (dummy(as.character(col)) == TRUE) print("dummy")
else print("not dummy")
}
}
data_dummy(df)