【问题标题】:Merge multiple mutually exclusive factor columns into a single column将多个互斥因子列合并为一列
【发布时间】:2014-11-08 12:03:34
【问题描述】:

假设我在一个数据框中有三列。我想将这些合并到一个列中。三列中的每一列都是一个二元属性,例如绿/黄、红/蓝、黑/白等。

我想将所有这些合并到一个包含多个的列中

 row1=c(0,0,1)
 row2=c(1,0,0)
 row3=c(0,1,0)
 df=data.frame(rbind(row1,row2,row3))

有没有办法将这些列中的每一个合并到一个列中?单列现在必须有六个不同的因子,而不是它已经有的两个。

谁能告诉我如何编码?

【问题讨论】:

  • 为什么是六级而不是八级?
  • 您希望结果有九行吗?
  • 您好,抱歉,我认为我的示例很难遵循。如果每列是红色/蓝色、黑色/白色、绿色/黄色,则每列只有两个可能的值。想象这是一辆汽车……它只能是一种颜色。因此,我会将其转换为 1 列:“颜色”,因此它将具有上面列出的 6 个可能值。但是,由于我正在使用的数据每列的编码为 0/1,我需要一种方法来明确这一点。
  • 您的示例并未反映这一点。例如,假设每行中的第一列代表红色/蓝色,第二列代表黑色/白色,第三列代表绿色/黄色,由列中的值 0/1 表示。然后第一行显示红色、黑色和黄色。
  • 如果这些是因素,请编辑问题以反映这一点。 (就目前而言,您的评论更正不连贯。)

标签: r merge categorical-data


【解决方案1】:

您可以像对二进制数进行编码一样对它们进行编码,方法是为每列分配增加的 2 次方。您想将每一行乘以c(1,2,4),然后求和。

# The multiplier, powers of two
x <- 2^(seq(ncol(df))-1)
x
## [1] 1 2 4

# The values
apply(df, 1, function(row) sum(row*x))
## row1 row2 row3 
## 4    1    2 

要将其添加为新列:

df$new <- apply(df, 1, function(row) sum(row*x))
df
##      X1 X2 X3 new
## row1  0  0  1   4
## row2  1  0  0   1
## row3  0  1  0   2

【讨论】:

  • 我以为他们在寻找类似的东西:data.frame(new=factor(c((1:2)[row1 + 1],(3:4)[row2 + 1],(5:6)[row3 + 1])))?
  • @thelatemail 有趣的解释,但由于它确实导致了所要求的六个级别,也许它是正确的。如果原始因素有标签,则更有意义。
【解决方案2】:

试试:

> df
     X1 X2 X3
row1  0  0  1
row2  1  0  0
row3  0  1  0
> 
> 
> mm = melt(df)
No id variables; using all as measure variables
> 
> mm$new = paste(mm$variable,mm$value,sep='_')
> 
> mm
  variable value  new
1       X1     0 X1_0
2       X1     1 X1_1
3       X1     0 X1_0
4       X2     0 X2_0
5       X2     0 X2_0
6       X2     1 X2_1
7       X3     1 X3_1
8       X3     0 X3_0
9       X3     0 X3_0

mm$new 是您想​​要的列。

【讨论】:

  • paste(colnames(df)[col(df)],as.matrix(df),sep="_")
  • 非常优雅的一个班轮。
【解决方案3】:

也许这就是你想要的:

> df$X1 = ifelse(df$X1==0,'green','yellow')
> df$X2 = ifelse(df$X2==0,'red','blue')
> df$X3 = ifelse(df$X3==0,'black','white')
> 
> df
         X1   X2    X3
row1  green  red white
row2 yellow  red black
row3  green blue black
> 
> unlist(df)
     X11      X12      X13      X21      X22      X23      X31      X32      X33 
 "green" "yellow"  "green"    "red"    "red"   "blue"  "white"  "black"  "black" 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-01
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    相关资源
    最近更新 更多