我很惊讶地看到R会在连接向量时将因子强制转换为数字。即使水平相同,也会发生这种情况。例如:
> facs <- as.factor(c("i", "want", "to", "be", "a", "factor", "not", "an", "integer"))
> facs
[1] i want to be a factor not an integer
Levels: a an be factor i integer not to want
> c(facs[1 : 3], facs[4 : 5])
[1] 5 9 8 3 1
在R中执行此操作的惯用方法是什么(在我的情况下,这些向量可能非常大)?谢谢。
答案 0 :(得分:31)
unlist(list(facs[1 : 3], facs[4 : 5]))
要'cbind'因素,请
data.frame(facs[1 : 3], facs[4 : 5])
答案 1 :(得分:8)
另一种解决方法是将因子转换为字符向量,然后在连接时进行转换。
cfacs <- as.character(facs)
x <- c(cfacs[1:3], cfacs[4:5])
# Now choose between
factor(x)
# and
factor(x, levels = levels(facs))
答案 2 :(得分:6)
x <- c(facs[1 : 3], facs[4 : 5])
x <- factor(x, levels=1:nlevels(facs), labels=levels(facs))
x
输出:
[1] i want to be a
Levels: a an be factor i integer not to want
仅当两个向量具有与此处相同的级别时才会起作用。
答案 3 :(得分:4)
这是一个非常糟糕的R问题。沿着这些方向,这里只是吞下了几个小时的时间。
x <- factor(c("Yes","Yes","No", "No", "Yes", "No"))
y <- c("Yes", x)
> y
[1] "Yes" "2" "2" "1" "1" "2" "1"
> is.factor(y)
[1] FALSE
在我看来,更好的解决方案是Richie's,它强加于角色。
> y <- c("Yes", as.character(x))
> y
[1] "Yes" "Yes" "Yes" "No" "No" "Yes" "No"
> y <- as.factor(y)
> y
[1] Yes Yes Yes No No Yes No
Levels: No Yes
正如里奇所提到的那样,只要你正确设定了水平。
答案 4 :(得分:2)
自从提出这个问题以来,Hadley Wickham创建了一个forcats
包,其fct_c
函数设计用于解决这类问题。
> library(forcats)
> facs <- as.factor(c("i", "want", "to", "be", "a", "factor", "not", "an",
"integer"))
> fct_c(facs[1:3], facs[4:5])
[1] i want to be a
Levels: a an be factor i integer not to want
作为旁注,fct_c
也不会被使用差异数字编码的因素连接所欺骗:
> x <- as.factor(c('c', 'z'))
> x
[1] c z
Levels: c z
> y <- as.factor(c('a', 'b', 'z'))
> y
[1] a b z
Levels: a b z
> c(x, y)
[1] 1 2 1 2 3
> fct_c(x, y)
[1] c z a b z
Levels: c z a b
> as.numeric(fct_c(x, y))
[1] 1 2 3 4 2
答案 5 :(得分:1)
快速说明一下,从 R 4.1.0 开始,这在基础 R 中直接解决。您现在可以直观地进行
c(facs[1 : 3], facs[4 : 5])
答案 6 :(得分:0)
基于使用以下函数转换为字符I的其他答案来连接因子:
concat.factor <- function(...){
as.factor(do.call(c, lapply(list(...), as.character)))
}
您可以像使用c
一样使用此功能。
答案 7 :(得分:0)
这是设置略有不同时添加到因子变量的另一种方法:
facs <- factor(1:3, levels=1:9,
labels=c("i", "want", "to", "be", "a", "factor", "not", "an", "integer"))
facs
# [1] i want to be a factor not an integer
# Levels: a an be factor i integer not to want
facs[4:6] <- levels(facs)[4:6]
facs
# [1] i want to be a factor
# Levels: i want to be a factor not an integer
答案 8 :(得分:0)
出于这个原因,我更喜欢使用data.frames中的因素:
df <- data.frame(facs = as.factor(
c("i", "want", "to", "be", "a", "factor", "not", "an", "integer") ))
并使用subset()或dplyr :: filter()等而不是行索引对其进行子集化。因为在这种情况下我没有有意义的子集标准,所以我将使用head()和tail():
df1 <- head(df, 4)
df2 <- tail(df, 2)
然后你可以很容易地操纵它们,例如:
dfc <- rbind(df1, df2)
dfc$facs
#[1] i want to be an integer
#Levels: a an be factor i integer not to want