我想创建一个带有新变量(最好是字母)的新列,以便稍后计算每个变量的频率。
假设我有一个名为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
新列中的值应基于前两列的唯一性。
答案 0 :(得分:2)
我们可以连接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
答案 1 :(得分:2)
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将因子级别重命名为字母。