【问题标题】:level based on bigger factor基于更大因素的水平
【发布时间】:2012-08-21 18:28:14
【问题描述】:

这里是示例数据。

df1 <- data.frame(y = 1:5, x = c("s", "m", "l", "s", "m"))

df2 <- data.frame(y = 1:4, x = c("s", "l", "s", "l"))

我希望 df2 基于 df1$x 具有三个级别。

我试过了

df2$x <- factor(df1$x)

那我有

Error in `$<-.data.frame`(`*tmp*`, "x", value = c(3L, 2L, 1L, 3L, 2L)) : 
  replacement has 5 rows, data has 4

levels(df2$x) <- factor(df1$x)

然后它会改变 df2。

df2
  y x
1 1 m
2 2 s
3 3 m
4 4 s

我该怎么做?

【问题讨论】:

  • 第一个给出了这个错误。 Error in $(*tmp*, "x", value = c(3L, 2L, 1L, 3L, 2L)) : replacement has 5 rows, data has 4.第二个更改了标签。

标签: r dataframe levels factors


【解决方案1】:

我不确定我是否正确理解了您的目标。

df1 <- data.frame(y = 1:5, x = factor(c("s", "m", "l", "s", "m")))
df2 <- data.frame(y = 1:4, x = factor(c("s", "l", "s", "l")))
df2$x
#[1] s l s l
#Levels: l s
levels(df2$x)<-unique(c(levels(df2$x),levels(df1$x)))
df2$x
#[1] s l s l
#Levels: l s m

【讨论】:

  • 不幸的是,级别的顺序发生了变化,与df1不同。这是输出。 &gt; str(df1) 'data.frame': 5 obs. of 2 variables: $ y: int 1 2 3 4 5 $ x: Factor w/ 3 levels "l","m","s": 3 2 1 3 2 &gt; str(df2) 'data.frame': 4 obs. of 2 variables: $ y: int 1 2 3 4 $ x: Factor w/ 3 levels "l","s","m": 2 1 2 1
  • 所以?在我看来,@Rolands 解决方案也适用于此。它所做的是将 df1$x 和 df2$x 中所有可能的因子水平设置为 df2$x 的水平。为了完整起见,您还可以在他的代码末尾添加 levels(df1$x)&lt;-levels(df2$x) 以使两个因素相同。
【解决方案2】:
df1 <- data.frame(y = 1:5, x = c("s", "m", "l", "s", "m"))

df2 <- data.frame(y = 1:4, x = factor(c("s", "l", "s", "l"), levels=levels(df1$x)))

 str(df2)
'data.frame':   4 obs. of  2 variables:
 $ y: int  1 2 3 4
 $ x: Factor w/ 3 levels "l","m","s": 3 1 3 1

【讨论】:

  • 如果不是所有级别的 df2 都已经在 df1 中,这将不起作用。例如。 df1 &lt;- data.frame(y = 1:5, x = c("a", "m", "l", "a", "m")) 会带来问题。 @Roland 的解决方案没有这个问题。
  • 确实如此,但这不是问题所在。此外,使用levels= unique( c(levels(df1$x, x) ) 很容易修复
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-01
  • 2021-02-21
  • 2020-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多