如何在另一列中的项目长度的R中添加列

时间:2015-08-26 12:45:32

标签: r

假设我有一个数据框,如:

set.seed(123)
df<-data.frame(y=sample( c("A","B","C"), 10, T), 
                X=sample(c (1,2,3), 10, T))
   y X
1  A 3
2  C 2
3  B 3
4  C 2
5  C 1
6  A 3
7  B 1
8  C 1
9  B 1
10 B 3

我想要的是添加一个列z来汇总列y的项目长度,例如:

   y X z
1  A 3 2
2  C 2 4
3  B 3 4
4  C 2 4
5  C 1 4
6  A 3 2
7  B 1 4
8  C 1 4
9  B 1 4
10 B 3 4

表示有2个As,4个C和4个B。

3 个答案:

答案 0 :(得分:2)

我们可以使用data.table根据每个'y'的元素数量(.N)创建列'z'。

library(data.table)
DT <- as.data.table(df)
DT[, z:= .N, by = y]
DT
#    y X z
# 1: A 3 2
# 2: C 2 4
# 3: B 3 4
# 4: C 2 4
# 5: C 1 4
# 6: A 3 2
# 7: B 1 4
# 8: C 1 4
# 9: B 1 4
#10: B 3 4

或者使用dplyr,我们按'y'分组并使用mutate创建新列'z'。相当于dplyr的{​​{1}}为.N

n()

答案 1 :(得分:2)

df$z=table(df$y)[df$y]
df
#    y X z
# 1  A 3 2
# 2  C 2 4
# 3  B 3 4
# 4  C 2 4
# 5  C 1 4
# 6  A 3 2
# 7  B 1 4
# 8  C 1 4
# 9  B 1 4
# 10 B 3 4

使用table,我们可以同时获取df$y列的每个元素的计数和名称。这样可以节省步骤。我们正在利用能够通过索引名称进行子集的优势。在这种情况下,该列属于类factor,但如果它们是as.character,则上述列也可以使用。

答案 2 :(得分:1)

这是一个使用for循环的简单方法:

for (i in levels(df$y)) df$z[df$y==i] <- sum(df$y==i)  
#> df
#   y X z
#1  A 3 2
#2  C 2 4
#3  B 3 4
#4  C 2 4
#5  C 1 4
#6  A 3 2
#7  B 1 4
#8  C 1 4
#9  B 1 4
#10 B 3 4