缩放跨不同因素的级别重新分配

时间:2017-07-22 17:59:24

标签: r

我经常使用调查数据从人们的回答中得出情绪分数。有些问题不是必填字段,因此包含空白,而有些问题可能会选择通过放置“不适用”之类的内容来排除答案。"最后一个挑战是,人们问题的(标准化)选项可能并不总是相同。但是,空白和" Not Applicable",值通常是。在导入此数据集时,将这些不同问题创建为因子的优势在于我最终将它们编码为数字等价物 - 因此可以对数据应用不同的可视化和统计方法。

这样做的一个缺点是我没有找到一种方法来扩展这些统一级别在各个因素之间的重新映射(其中包含不同的级别)。

age_group <- c("10-20 years old", "21-30 years old", "10-20 years old", "") # natural order to this 
favorite_color <- c("blue", "red", "green", "") # a vector without an ordinal set of levels
education <- c("primary", "secondary", "primary", "")

df_info <- data.frame(factor(age_group, levels = c( "", "10-20 years old", "21-30 years old")),
                      factor(favorite_color, levels = c("", "red", "green", "blue")),
                      factor(education, levels = c("", "primary", "secondary")))
names(df_info) <- c("Age", "Color", "Edu")

鉴于上述情况,我发现以下方法有效:

levels(df_info$Color)[1] <- 'missing'
levels(df_info$Edu)[1] <- 'missing'
levels(df_info$Age)[1] <- 'missing'

同样,以下内容也有效:

levels(df_info[paste('Color')])[1] <- 'missing'
# ...etc.

然而,当试图扩展这个并调用&#34;等级时,#34>函数验证此方法是否有效,我返回NULL。的 WHY ???

# This DOES NOT work:
change_list <- c("Age", "Color", "Edu")
for( item in change_list ) {
   levels(df_info[paste(item)])[1] <- 'missing'
}

# Result of levels(df_info$*AnyVariable*) is **NULL**

幸运的是,我还没有 在足够大的范围内工作,手动解决方案是不可能的,但它让我觉得没有更有效的方法来从这些因素中删除这些空白。所有帮助和评论都非常感谢!

2 个答案:

答案 0 :(得分:0)

您需要将[更改为[[,前者返回单个列数据框,而后者返回列向量:

class(df_info['Age'])
# [1] "data.frame"
class(df_info[['Age']])
# [1] "factor"

运行:

lapply(df_info, levels)
#$Age
#[1] ""                "10-20 years old" "21-30 years old"

#$Color
#[1] ""      "red"   "green" "blue" 

#$Edu
#[1] ""          "primary"   "secondary"

change_list <- c("Age", "Color", "Edu")
for( item in change_list ) {
   levels(df_info[[item]])[1] <- 'missing'
#                ^^    ^^ 
}

lapply(df_info, levels)
#$Age
#[1] "missing"         "10-20 years old" "21-30 years old"

#$Color
#[1] "missing" "red"     "green"   "blue"   

#$Edu
#[1] "missing"   "primary"   "secondary"

答案 1 :(得分:0)

您可以使用属于 column1 column2 is_duplicate 0 xyz XYZ 1 1 xyz XyZ 1 2 xyz ABC 0 3 xyz aBc 0 4 abc XYZ 0 5 abc XyZ 0 6 abc ABC 1 7 abc aBc 1

forcats个包
tidyverse