如何重命名在R中出现少于x次的数据列中的值?

时间:2016-12-15 20:24:38

标签: r

我想在我的数据列中重命名一些值,这些值少于5次。

     Var1   Var2
1     A    High
2     A    High
3     A    High
4     B    High
5     B    Med
6     B    Vlow
7     C    Vlow
8     C    Low
9     C    Low
10    C    Low
11    A    High
12    B    Hlow
13    C    Med
14    A    Low
15    A    Low

因此,在这种情况下,我想将Var2列的值重命名为“other”,其值小于5次(HlowMedVlow)。预期结果应为:

   Var1  Var2
1     A  High
2     A  High
3     A  High
4     B  High
5     B Other
6     B Other
7     C Other
8     C   Low
9     C   Low
10    C   Low
11    A  High
12    B Other
13    C Other
14    A   Low
15    A   Low

以下是我的数据框的dput()

structure(list(Var1 = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 
3L, 3L, 3L, 1L, 2L, 3L, 1L, 1L), .Label = c("A", "B", "C"), class = "factor"), 
    Var2 = structure(c(1L, 1L, 1L, 1L, 4L, 5L, 5L, 3L, 3L, 3L, 
    1L, 2L, 4L, 3L, 3L), .Label = c("High", "Hlow", "Low", "Med", 
    "Vlow"), class = "factor")), .Names = c("Var1", "Var2"), class = "data.frame", row.names = c(NA, 
-15L))

两列都是分类变量(因子)。

2 个答案:

答案 0 :(得分:1)

由于Var2factor,您可以使用Hadley的新forcats套餐:

nlevels_to_keep <- sum(table(df$Var2) >= 5)
df$Var2 <- forcats::fct_lump(df$Var2, n = nlevels_to_keep)
df
#   Var1  Var2
#1     A  High
#2     A  High
#3     A  High
#4     B  High
#5     B Other
#6     B Other
#7     C Other
#8     C   Low
#9     C   Low
#10    C   Low
#11    A  High
#12    B Other
#13    C Other
#14    A   Low
#15    A   Low

说明

fct_lump()函数将最少/最常见的级别整合到&#34;其他&#34; 中。参数n的正值指定保持最常见(&#34;顶部&#34;)n级别。

要获得要保留的前n个级别,我们必须使用Var2计算table()中每个级别的外观。然后我们看看计数等于或大于5的次数。这里,我们使用&#34;技巧&#34;转换为整数时,FALSE变为0TRUE变为1。因此,sum()会返回TRUE s的数量。

数据

df <- read.table(header = TRUE, text = "Var1   Var2
A    High
A    High
A    High
B    High
B    Med
B    Vlow
C    Vlow
C    Low
C    Low
C    Low
A    High
B    Hlow
C    Med
A    Low
A    Low")

答案 1 :(得分:1)

首先使用table确定Var2的哪些值低于您的阈值。

freqs <- table(df[["Var2"]])
lowVals <- names(freqs[freqs < 5])

现在,我们可以使用%in%Var2索引到小于freq的值,并将其替换为Other

df[["Var2"]][df[["Var2"]] %in% lowVals] <- "Other"