根据唯一的行集

时间:2018-01-31 16:44:08

标签: r dataframe r-factor

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

假设我有一个名为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

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

2 个答案:

答案 0 :(得分:2)

我们可以连接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

答案 1 :(得分:2)

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将因子级别重命名为字母。