根据唯一行集创建新的级别列
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
我可以看到我独特的行集,其中 colors
和 val
列具有相同的输入,例如:
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
新列中的值应基于它前面前两列的唯一性。
我们可以连接 val
和 color
列并将其创建为因子,然后我们可以按字母更改因子级别。
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
列中的字母。如果你想为 colors
和 val
的每个唯一组合创建一个因子变量,你可以按照这些行做一些事情:
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))])
我首先为 val
和 colors
的每个唯一组合创建一个新的因子变量,然后使用 plyr::mapvalues 将因子水平重命名为字母。
我想创建一个包含新变量(最好是字母)的新列,以便稍后计算每组的频率。
假设我有一个名为 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
我可以看到我独特的行集,其中 colors
和 val
列具有相同的输入,例如:
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
新列中的值应基于它前面前两列的唯一性。
我们可以连接 val
和 color
列并将其创建为因子,然后我们可以按字母更改因子级别。
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
列中的字母。如果你想为 colors
和 val
的每个唯一组合创建一个因子变量,你可以按照这些行做一些事情:
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))])
我首先为 val
和 colors
的每个唯一组合创建一个新的因子变量,然后使用 plyr::mapvalues 将因子水平重命名为字母。