【发布时间】:2015-03-05 11:55:31
【问题描述】:
我正在处理的数据框包含许多因素。从 mtcars (cyl, vs, am, gear, carb) 中获取分类变量。
head(mtcars[c("cyl","vs","am","gear","carb")])
cyl vs am gear carb
Mazda RX4 6 0 1 4 4
Mazda RX4 Wag 6 0 1 4 4
Datsun 710 4 1 1 4 1
Hornet 4 Drive 6 1 0 3 1
Hornet Sportabout 8 0 0 3 2
Valiant 6 1 0 3 1
目前我有两个嵌套的 for 循环来提取在特定因素中出现的时间少于 10% 的级别,并将其分配给新的级别名称。所以我想将因子中的那些 levsl 分配给一个名为 guz 的新级别。有没有优雅的 wqy 来做到这一点?
输出将是一个数据框,其中对于everz 因子(假设数据集中的上述列是因子),属于发生少于10 次的级别的那些行被归于新级别guz。以碳水化合物中的第 2 级为例……它只发生一次(好吧,超过 10%,但想象一下它会是这种情况),然后在这个 fdactor 中分类这个级别(以及在这个因素中为真的所有其他级别)进入一个新的关卡名称guz。新的碳水化合物列将是 4,4,1,1,guz,1。
50% 阈值的输出将是
head(mtcars[c("cyl","vs","am","gear","carb")])
cyl vs am gear carb
Mazda RX4 6 0 1 4 guz
Mazda RX4 Wag 6 0 1 4 guz
Datsun 710 guz 1 1 4 1
Hornet 4 Drive 6 1 0 3 1
Hornet Sportabout guz 0 0 3 guz
Valiant 6 1 0 3 1
【问题讨论】:
-
你可能需要使用
table,假设df1是data.frame,lapply(df1, function(x) {x1 <- 100*prop.table(table(x)); names(x1)[x1 <10]}) -
您的问题需要澄清一下。所以在有 32 行的 mtcars 中,你想将其中一列变成一个因子,然后重新分类,以便将任何低于数据 10%(本例中为 3.2)的级别重命名为“guz”?跨度>
-
我想将所有这些行变成...sry 列变成因子,然后将那些出现少于 10 次的级别排除到称为 guz 的新级别中。所以不要将它们完全删除,只需更改关卡的名称即可。
-
您的预期结果是?对于
mtcars -
我不明白你的输出。马自达 RX4 的 cyl=6,有 7 行 cyl=6,不到 50% 的行,那么肯定也应该是“guz”吗?还是该示例输出仅用于 head(mtcars) 作为输入?
标签: r dataframe categorical-data