假设我有一个数据框,如:
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。
答案 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