48

ベクトルを連結するときに、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でこれを行う慣用的な方法は何ですか(私の場合、これらのベクトルはかなり大きくなる可能性があります)?ありがとうございました。

4

9 に答える 9

39

Rメーリングリストから:

unlist(list(facs[1 : 3], facs[4 : 5]))

因子を「結合」するには、

data.frame(facs[1 : 3], facs[4 : 5])
于 2011-02-21T17:08:54.230 に答える
10

別の回避策は、因子を文字ベクトルに変換し、連結が終了したときに元に戻すことです。

cfacs <- as.character(facs)
x <- c(cfacs[1:3], cfacs[4:5]) 

# Now choose between
factor(x)
# and
factor(x, levels = levels(facs))
于 2010-08-10T13:25:07.477 に答える
8

パッケージ(tidyversefct_cの一部)から使用します。forcats

> 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
于 2018-05-15T23:36:33.470 に答える
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

2つのベクトルがここと同じレベルである場合にのみ機能します。

于 2010-08-09T19:55:27.623 に答える
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

私には、より良い修正は、キャラクターに強制するリッチーのものであるように思われます。

> 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

リッチーが言うように、レベルが適切に設定されている限り。

于 2014-03-31T14:53:37.160 に答える
2

文字への変換を使用する他の回答に基づいて、次の関数を使用して要素を連結しています。

concat.factor <- function(...){
  as.factor(do.call(c, lapply(list(...), as.character)))
}

この関数は、と同じように使用できますc

于 2016-10-19T08:29:54.553 に答える
1

このため、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
于 2017-05-31T13:54:53.260 に答える
1

R 4.1.0以降、これはベースRで直接対処されていることを指摘しておきます。これで、直感的に実行できるようになります。

c(facs[1 : 3], facs[4 : 5])
于 2021-07-20T00:29:34.127 に答える
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
于 2016-11-05T15:49:53.863 に答える