我很好奇标记 data.table 频率表的最简单方法是什么。例如,假设我有一个 data.table (dt1),其中以下列(动物)为
c(1,1,2,2,2,2,3,3,3,3,3,3)
我用:
dt2 <- dt1[, .N ,by = animals]
获取频率表(dt2)例如:
animals N
1: 1 2
2: 2 4
3: 3 6
如果
,标记(重命名)动物列的最优雅的方式是什么?1 = turtle
2 = horse
3 = cat
4 = dog
如果没有 4/dog,则通过参考很容易做到,例如
dt2[animals == c(1:3), animalnames := c("turtle", "horse", "cat")]
但是,这带来了两个问题:
a)它创建了一个新列,这意味着需要处理“动物”列,这没什么大不了的,但如果有一个更优雅的解决方案就好了
b) 包含“dog”(“动物”列中不存在的元素)会导致错误:
dt2[animals == c(1:4), animalnames := c("turtle", "horse", "cat", "dog")]
Error in .prepareFastSubset(isub = isub, x = x, enclos = parent.frame(), :
RHS of == is length 4 which is not 1 or nrow (3). For robustness, no recycling is allowed (other than of length 1 RHS). Consider %in% instead.
如果您满足以下条件,最简单的解决方案是什么: a) 想要重新标记“动物”列 b)希望能够使用给定样本中可以但可能不存在的可能标签列表(即另一个样本可能包含狗,另一个样本可能不包含猫,但我想对所有样本使用相同的代码)
谢谢!
你可以使用
fcase
:
dt2[,animals := fcase(animals == 1,'turtle',animals == 2,'horse',animals==3,'cat',animals=4,'dog')]
dt2
# animals N
# <char> <int>
#1: turtle 2
#2: horse 4
#3: cat 6