【问题标题】:How to reduce factor levels depending on other attribute?如何根据其他属性降低因子水平?
【发布时间】:2020-01-20 12:16:23
【问题描述】:

我有一个包含两列 idresult 的数据框,我想根据 id 为结果分配因子水平。因此对于 id "1",结果 c("a","b","c","d") 将具有因子水平 1、2、3、4。 对于 id "2",结果 c("22","23","24") 将具有因子水平 1、2、3。

id <- c(1,1,1,1,2,2,2)
result <- c("a","b","c","d","22","23","24")

我尝试通过拆分对它们进行分组,但是它们将被转换为列表而不是数据框,这会导致建模的长度问题。你能帮忙吗?

【问题讨论】:

  • 假设你有数据框df &lt;- data.frame(id, result),使用dplyr,你可以做到df %&gt;% group_by(id) %&gt;% mutate(row = row_number())
  • @RonakShah 我不相信这是一个骗子,你必须转换df %&gt;% etc %&gt;% mutate(fac = factor(row)) %&gt;% select(-row)etc 是你的代码。
  • @RuiBarradas-ReinstateMonic 当然,如果您不同意,请随时重新打开。

标签: r


【解决方案1】:

尽管用户@Ronak Shahduplicate 结束了该问题,但我认为这不是同一个问题。

按组对行进行编号后,必须将新列强制转换为 "factor" 类。

library(dplyr)

id <- c(1,1,1,1,2,2,2)
result <- c("a","b","c","d","22","23","24")

df <- data.frame(id, result)

df %>%
  group_by(id) %>%
  mutate(fac = row_number()) %>%
  ungroup() %>%
  mutate(fac = factor(fac))
# A tibble: 7 x 3
#     id result fac  
#  <dbl> <fct>  <fct>
#1     1 a      1    
#2     1 b      2    
#3     1 c      3    
#4     1 d      4    
#5     2 22     1    
#6     2 23     2    
#7     2 24     3    

编辑。

如果 result 中有重复值,则强制 as.integer/factor 获取数字,然后强制这些数字进行因子。

id2 <- c(1,1,1,1,2,2,2,2)
result2 <- c("a","b","c","d","22", "22","23","24")

df2 <- data.frame(id = id2, result = result2)

df2 %>%
  group_by(id) %>%
  mutate(fac = as.integer(factor(result))) %>%
  ungroup() %>%
  mutate(fac = factor(fac))
# A tibble: 8 x 3
#     id result fac  
#  <dbl> <fct>  <fct>
#1     1 a      1    
#2     1 b      2    
#3     1 c      3    
#4     1 d      4    
#5     2 22     1    
#6     2 22     1    
#7     2 23     2    
#8     2 24     3    

【讨论】:

  • 非常感谢!它起作用了:D 如何将因子级别分配给结果的唯一值?例如,如果结果
  • @y.eska 这意味着id == 1, result == "a" 的新列将具有与id == 2, result == "22" 相同的因子水平(值)。
【解决方案2】:

id分组后,我们可以使用matchunique为每个result分配唯一编号。使用@Rui Barradas 的数据框df2

library(dplyr)

df2 %>%
  group_by(id) %>%
  mutate(ans = match(result, unique(result))) %>%
  ungroup %>%
  mutate(ans = factor(ans))

#     id result ans  
#  <dbl> <fct>  <fct>
#1     1 a      1    
#2     1 b      2    
#3     1 c      3    
#4     1 d      4    
#5     2 22     1    
#6     2 22     1    
#7     2 23     2    
#8     2 24     3    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    • 2019-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多