【问题标题】:Create a new level column based on unique row sets基于唯一行集创建新级别列
【发布时间】:2018-01-31 16:44:08
【问题描述】:

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

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

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

【问题讨论】:

    标签: r dataframe r-factor


    【解决方案1】:

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

    【讨论】:

    • 谢谢,这正是我所要求的,尽管由于与 dplyr 的冲突,从库调用 plyr 是一个有风险的包。因此,我将那部分更改为: datatemp$freq
    【解决方案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
    

    【讨论】:

    • 嘿,感谢您的快速回复,但我的情况比这有点复杂,现在意识到我应该在这个问题上更清楚。总而言之,我在两个不同的列中有两个不同的类,例如: > colA colB newcol > 10 11 A > 12 15 B > 10 11 A > 13 15 C 等等,所以我想检查唯一的条件前两列放在一起,然后我想要一个新列,其中包含一组新变量(在本例中为字母)来指示唯一行的组。
    • @DSA 请查看我的更新,看看它是否是您需要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    • 1970-01-01
    • 2019-07-07
    • 1970-01-01
    相关资源
    最近更新 更多