在回答另一个问题时,@ Mayk发布了以下解决方案:https://stackoverflow.com/a/10432263/636656
dat <- structure(list(product = c(11L, 11L, 9L, 9L, 6L, 1L, 11L, 5L,
7L, 11L, 5L, 11L, 4L, 3L, 10L, 7L, 10L, 5L, 9L, 8L)), .Names = "product", row.names = c(NA, -20L), class = "data.frame")
`levels<-`(
factor(dat$product),
list(Tylenol=1:3, Advil=4:6, Bayer=7:9, Generic=10:12)
)
Run Code Online (Sandbox Code Playgroud)
哪个产生输出:
[1] Generic Generic Bayer Bayer Advil Tylenol Generic Advil Bayer Generic Advil Generic Advil Tylenol
[15] Generic Bayer Generic Advil Bayer Bayer
Run Code Online (Sandbox Code Playgroud)
这只是矢量的打印输出,所以要存储它你可以做得更加困惑:
res <- `levels<-`(
factor(dat$product),
list(Tylenol=1:3, Advil=4:6, Bayer=7:9, Generic=10:12)
)
Run Code Online (Sandbox Code Playgroud)
显然这是对level函数的某种调用,但我不知道这里做了什么.这种巫术的术语是什么,我如何在这个领域增加我的魔法能力?
我有一列数据是A,B和C级别的因素,我有兴趣将这些级别中的两个组合成一个因子,所以它会变成A和B,B = B和C,或者可能是新的变量A和D,D = B和C.我可以通过使用if语句循环遍历列来提供大量方法来实现这一点,但我觉得应该有一个更优雅的方法,我想知道是否有人可以指出我正确的方向.
我经常遇到这种情况,我认为必须有一个很好的成语.假设我有一个包含一系列属性的data.frame,包括"product".我还有一把钥匙,可以将产品转化为品牌+尺寸.产品代码1-3是Tylenol,4-6是Advil,7-9是拜耳,10-12是Generic.
什么是最快的(就人类时间而言)编码方式?
ifelse如果有3个或更少的类别,我倾向于使用嵌套的;如果有超过3个类型,则键入数据表并将其合并.任何更好的想法?Stata有一个非常漂亮的recode命令,虽然我相信它会促进数据代码混合有点过分.
dat <- structure(list(product = c(11L, 11L, 9L, 9L, 6L, 1L, 11L, 5L,
7L, 11L, 5L, 11L, 4L, 3L, 10L, 7L, 10L, 5L, 9L, 8L)), .Names = "product", row.names = c(NA,
-20L), class = "data.frame")
Run Code Online (Sandbox Code Playgroud) 我想把级别"A","B"组合成"A + B".我通过以下方式成功完成了此操作:
x <- factor(c("A","B","A","C","D","E","A","E","C"))
x
#[1] A B A C D E A E C
#Levels: A B C D E
l <- c("A+B","A+B","C","D+E","D+E")
factor(l[as.numeric(x)])
#[1] A+B A+B A+B C D+E D+E A+B D+E C
#Levels: A+B C D+E
Run Code Online (Sandbox Code Playgroud)
有没有更简单的方法来做到这一点?(即更多可解释的函数名称,例如combine.factor(f,old.levels,new.levels)将有助于更容易理解代码.)
此外,我试图找到一个很好的命名函数,可能在dplyr包中使用数据框但没有运气.最接近的实施是
df %>% mutate(x = factor(l[as.numeric(x)]))
Run Code Online (Sandbox Code Playgroud) 这是我正在尝试做的一个简单的例子:
iris %>%
mutate(Species2 = ifelse(Species %in% c("setosa", "virginica"), "other", as.character(Species)) %>% as.factor) %>%
str
# 'data.frame': 150 obs. of 6 variables:
# $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
# $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
# $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
# $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 …Run Code Online (Sandbox Code Playgroud) 我正在尝试将因子水平结合起来data.table并想知道是否存在data.table这样做的方法.
例:
DT = data.table(id = 1:20, ind = as.factor(sample(8, 20, replace = TRUE)))
Run Code Online (Sandbox Code Playgroud)
我想说类型1,3,8属于A组; 2和4属于B组; 和5,6,7在C组.
这就是我一直在做的事情,这个问题的完整版本速度很慢:
DT[ind %in% c(1, 3, 8), grp := as.factor("A")]
DT[ind %in% c(2, 4), grp := as.factor("B")]
DT[ind %in% c(5, 6, 7), grp := as.factor("C")]
Run Code Online (Sandbox Code Playgroud)
这个相关问题提出的另一种方法,我猜这样翻译:
DT[ , grp := ind]
levels(DT$grp) = c("A", "B", "A", "B", "C", "C", "C", "A")
Run Code Online (Sandbox Code Playgroud)
或许(考虑到我有65个基础组和18个聚合组,这感觉有点整洁)
DT[ , grp := ind]
lev <- letters(1:8)
lev[c(1, 3, 8)] <- "A"
lev[c(2, 4)] <- "B" …Run Code Online (Sandbox Code Playgroud) 我现在正在学习R,我遇到了查找命令的问题.
我有分类数据
levels(job)
[1] "admin." "blue-collar" "entrepreneur" "housemaid"
[5] "management" "retired" "self-employed" "services"
[9] "student" "technician" "unemployed" "unknown"
Run Code Online (Sandbox Code Playgroud)
现在我想简化这些级别,例如
levels(job)
[1] "class1" "class2" "class3" "unknown"
Run Code Online (Sandbox Code Playgroud)
其中type1包括"admin.","entrepreneur",和"self-employed";
type2包括"blue-collar","management",和"technician";
type3包括"housemaid","student","retired",和"services";
unknown包括"unknown"和"unemployed".
为此,我可以使用哪个命令?谢谢!严
我在数据框中有一列超过 40 个级别,我想将其设为 4 个级别。重要的变量是“电子商务”、“技术”和“消费品”,我想归入“其他”的所有其他变量。我怎样才能把它变成4个级别?