将新因子级别添加到R中的变量

时间:2015-12-17 03:08:13

标签: r

假设我有这样的数据

content_type:source

Id Name Price sales Profit Month Category Mode Supplier 1 A 2 5 8 1 X K John 1 A 2 6 9 2 X K John 1 A 2 5 8 3 X K John 2 B 2 4 6 1 X L Sam 2 B 2 3 4 2 X L Sam 2 B 2 5 7 3 X L Sam 3 C 2 5 11 1 X M John 3 C 2 5 11 2 X L John 3 C 2 5 11 3 X K John 4 D 2 8 10 1 Y M John 4 D 2 8 10 2 Y K John 4 D 2 5 7 3 Y K John 5 E 2 5 9 1 Y M Sam 5 E 2 5 9 2 Y L Sam 5 E 2 5 9 3 Y M Sam 6 F 2 4 7 1 Z M Kyle 6 F 2 5 8 2 Z L Kyle 6 F 2 5 8 3 Z M Kyle subset我发现哪个table有多少Category个唯一产品。

Mode

现在我要在 K L M X 2 2 1 Y 1 1 2 Z 0 1 1 的{​​{1}}表格中添加一个新条目,以便它看起来像

Mode

所以str(df)将是

total

因此,在我添加一个新的因子模式变量后,它将变为

    K L M Total
  X 2 2 1 5
  Y 1 1 2 4
  Z 0 1 1 2

因此,模式的因子水平从3变为4,观察数量从9变为12。 我可以通过获取data.frame': 9 obs. of 3 variables: $ Category : Factor w/ 3 levels "X","Y"..: $ Mode: Factor w/ 3 levels "K","L","M"..: 1 1 1 1 1 1 ... $ Freq : int 2,2,1 ... data.frame': 12 obs. of 3 variables: $ Category : Factor w/ 3 levels "X","Y"..: $ Mode: Factor w/ 4 levels "K","L","M", "Total"..: 1 1 11 1 ... $ Freq : int 2,2,1,5 ... 来添加新的总列,但它不会满足我的目的。我希望rowSums使用行总和的值获得cbind的新因子级别。

我希望我解释得很清楚。

2 个答案:

答案 0 :(得分:4)

我还不确定你想要什么(!),但这可能会越来越近了?

我认为最简单的方法是使用rbind.fill() character函数,它会自动统一因子级别。您也可以手动执行此操作,方法是将因子变量转换回dat2 <- structure(list(Category = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L), .Label = c("X", "Y", "Z"), class = "factor"), Mode = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 2L, 1L, 3L, 1L, 1L, 3L, 2L, 3L, 3L, 2L, 3L), .Label = c("K", "L", "M"), class = "factor")), .Names = c("Category", "Mode"), row.names = c(NA, 18L), class = "data.frame") 变量,然后再将各个部分组合在一起。

数据:

tab <- with(dat,addmargins(table(Category,Mode),2))

获取行总数:

dat3 <- data.frame(Category=rownames(tab),Mode=paste("Total:",tab[,"Sum"]))

将行总计转换为数据框:

plyr::rbind.fill(dat2,dat3)

级联:

public class TestPublic{
    internal class TestInternal{
        private class TestPrivate{
            private var x = 123
        }
        func foo()
        {
            print(TestPrivate().x)
        }
    }
}

let x = TestPublic()                        
let y = TestPublic.TestInternal()           
let z = TestPublic.TestInternal.TestPrivate() // This trigger an access error!!!
y.foo() // After removing last line.Everything compiles well and output '123'

答案 1 :(得分:0)

这是另一种可能的做法。我只是想指出,这样做将扩展Category和Mode列中的行数,因此您必须弄清楚如何扩展数据框中的其他列。让我们首先重新创建类似于Category和Mode列的内容,然后添加'Total'因子级别:

> Mode <- factor(sample(c('K', 'L', 'M'), 18, replace=T))    
> Category <- factor(c(rep('X', 9), rep('Y', 6), rep('Z', 3)))
> data.frame(Category=Category, Mode=Mode)
   Category Mode
1         X    M
2         X    K
3         X    K
4         X    M
5         X    K
6         X    K
7         X    K
8         X    M
9         X    L
10        Y    M
11        Y    L
12        Y    M
13        Y    M
14        Y    M
15        Y    M
16        Z    K
17        Z    K
18        Z    L
> table(Category, Mode)
        Mode
Category K L M
       X 5 1 3
       Y 0 1 5
       Z 2 1 0
> Total <- rowSums(table(Category, Mode))
> Category <- factor(c(as.character(Category), rep('X', Total[1]), rep('Y', Total[2]), rep('Z', Total[3])))
> Mode <- factor(c(as.character(Mode), rep('Total', sum(Total))))
> data.frame(Category=Category, Mode=Mode)
   Category  Mode
1         X     M
2         X     K
3         X     K
4         X     M
5         X     K
6         X     K
7         X     K
8         X     M
9         X     L
10        Y     M
11        Y     L
12        Y     M
13        Y     M
14        Y     M
15        Y     M
16        Z     K
17        Z     K
18        Z     L
19        X Total
20        X Total
21        X Total
22        X Total
23        X Total
24        X Total
25        X Total
26        X Total
27        X Total
28        Y Total
29        Y Total
30        Y Total
31        Y Total
32        Y Total
33        Y Total
34        Z Total
35        Z Total
36        Z Total
> table(Category, Mode)
        Mode
Category K L M Total
       X 5 1 3     9
       Y 0 1 5     6
       Z 2 1 0     3