【问题标题】:R CUT Data TableR CUT 数据表
【发布时间】:2018-05-17 13:44:37
【问题描述】:

在对 data.table 进行剪切时遇到以下问题。 我不知道为什么它不能正确地通过“prod”进行过滤。 如果我在外面运行切割,如下所示,它会正确切割但不在数据表内。 你知道为什么以及如何解决它吗? 谢谢你

library(data.table)
    db<-data.frame(count=c(331948, 334999, 321000, 305000, 324100, 310000, 305000, 325000, 305000, 329999, 315000,531948, 534999, 521000, 505000, 524100, 510000, 505000, 525000, 505000, 529999, 515000), prod=c("a","a","a","a","a","a","a","a","a","a","a","b","b","b","b","b","b","b","b","b","b","b"))

head(db)

    count prod
1  331948    a
2  334999    a
3  321000    a
4  305000    a
5  324100    a
6  310000    a

setDT(db)[ , id := cut(count,8,digits=1,dig.lab = 7), by = prod]

    count prod                  id
1: 331948    a   (531249.1,535029]
2: 334999    a   (531249.1,535029]
3: 321000    a (519999.5,523749.4]
4: 305000    a   (504970,508749.9]
5: 324100    a (523749.4,527499.2]
6: 310000    a (508749.9,512499.8]

table(db[db$prod=='a',]$id)

 (504970,508749.9] (508749.9,512499.8] (512499.8,516249.6] (516249.6,519999.5] (519999.5,523749.4] (523749.4,527499.2] (527499.2,531249.1]   (531249.1,535029] 
                  3                   1                   1                   0                   1                   2                   1                   2 

table(cut(db[db$prod=='a',]$count,8,digits=1,dig.lab = 7))

(304970,308749.9] (308749.9,312499.8] (312499.8,316249.6] (316249.6,319999.5] (319999.5,323749.4] (323749.4,327499.2] (327499.2,331249.1]   (331249.1,335029] 
                  3                   1                   1                   0                   1                   2                   1                   2 

【问题讨论】:

  • 上述代码中cut 函数的用途是什么?
  • 我希望为每个产品生成范围。我需要这个用于实际的数据集。

标签: r cut


【解决方案1】:

您可以尝试先将cut 的分组输出转换为character 并添加一列。现在在下一个语句中将新列(包含字符)转换为factor,而不对任何内容进行分组。这样,您将能够避免强制到相同值的分组因素。

你可以试试:

library(data.table)

# Data
db<-data.table(count=c(331948, 334999, 321000, 305000, 324100, 310000, 305000, 
325000, 305000, 329999, 315000,531948, 534999, 521000, 505000, 524100,
510000, 505000, 525000, 505000, 529999, 515000),
prod=c("a","a","a","a","a","a","a","a","a","a","a","b","b","b","b","b",
      "b","b","b","b","b","b"))

# Try this
db[, id := as.character(cut(count, 8, digits=1, dig.lab = 7)), by=.(prod)][
    ,id:=as.factor(id)]

# Result 
db
      count prod                  id
# 1: 331948    a   (331249.1,335029]
# 2: 334999    a   (331249.1,335029]
# 3: 321000    a (319999.5,323749.4]
# 4: 305000    a   (304970,308749.9]
# 5: 324100    a (323749.4,327499.2]
# 6: 310000    a (308749.9,312499.8]
# 7: 305000    a   (304970,308749.9]
# 8: 325000    a (323749.4,327499.2]
# 9: 305000    a   (304970,308749.9]
# 10: 329999    a (327499.2,331249.1]
# 11: 315000    a (312499.8,316249.6]
# 12: 531948    b   (531249.1,535029]
# 13: 534999    b   (531249.1,535029] 
# so on 

【讨论】:

  • 还不对,因为“B”的结果和“A”的结果是一样的。
  • @lolo 对不起。这是我的错字,因为我没有从我的 RStudio 复制最后一个答案。现在就来看看吧。
猜你喜欢
  • 1970-01-01
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
  • 2011-03-20
  • 2020-12-17
  • 2020-05-05
  • 2021-09-04
  • 2013-11-07
相关资源
最近更新 更多