根据唯一行集创建新的级别列

Create a new level column based on unique row sets

我想创建一个包含新变量(最好是字母)的新列,以便稍后计算每组的频率。

假设我有一个名为 datatemp 的数据框,它类似于:

 datatemp = data.frame(colors=rep( c("red","blue"), 6), val = 1:6)
    colors val
1     red   1
2    blue   2
3     red   3
4    blue   4
5     red   5
6    blue   6
7     red   1
8    blue   2
9     red   3
10   blue   4
11    red   5
12   blue   6

我可以看到我独特的行集,其中 colorsval 列具有相同的输入,例如:

 unique(datatemp[c("colors","val")]) 
   colors val
1    red   1
2   blue   2
3    red   3
4   blue   4
5    red   5
6   blue   6

我真正想做的是在同一个数据框中创建一个新列,上面的每个唯一行集都有一个级别,例如:

    colors val freq
1     red   1   A
2    blue   2   B
3     red   3   C
4    blue   4   D
5     red   5   E
6    blue   6   F
7     red   1   A
8    blue   2   B
9     red   3   C
10   blue   4   D
11    red   5   E
12   blue   6   F

我知道这是非常基本的,但是,对于庞大的数据集,我想不出一个有用的想法。

所以让问题更清楚,我在下面给出所需输出的另一种表示:

   colA     colB  newcol
    10        11     A
    12        15     B
    10        11     A
    13        15     C

新列中的值应基于它前面前两列的唯一性。

我们可以连接 valcolor 列并将其创建为因子,然后我们可以按字母更改因子级别。

datatemp$Freq <- as.factor(paste(datatemp$val, datatemp$colors, sep = "_"))
levels(datatemp$Freq) <- LETTERS[1:length(levels(datatemp$Freq))]
datatemp
#    colors val Freq
# 1     red   1    A
# 2    blue   2    B
# 3     red   3    C
# 4    blue   4    D
# 5     red   5    E
# 6    blue   6    F
# 7     red   1    A
# 8    blue   2    B
# 9     red   3    C
# 10   blue   4    D
# 11    red   5    E
# 12   blue   6    F

www 的解决方案将 value 列中的唯一值映射到 freq 列中的字母。如果你想为 colorsval 的每个唯一组合创建一个因子变量,你可以按照这些行做一些事情:

library(plyr)
datatemp = data.frame(colors=rep( c("red","blue"), 6), val = 1:6)
datatemp$freq <- factor(paste(datatemp$colors, datatemp$val), levels=unique(paste(datatemp$colors, datatemp$val)))
datatemp$freq <- mapvalues(datatemp$freq, from = levels(datatemp$freq), to = LETTERS[1:length(levels(datatemp$freq))])

我首先为 valcolors 的每个唯一组合创建一个新的因子变量,然后使用 plyr::mapvalues 将因子水平重命名为字母。