我有一个这样的数据框:
measure <- rnorm(1:100, mean = 5, sd = 2)
year <- c(rep(2015,25),rep(2016,25),rep(2015,25),rep(2016,25))
individuals <- c(rep('a',50), rep('b',50))
df <- as.data.frame(measure, year, individuals)
我希望根据“&#39;个人”列添加一列显示nrow(df)
的百分比。也就是说,当列到达发生df$individuals == 'a'
的最后一行时,列从0开始并在100结束。然后它应该重新开始直到df$individuals == 'b'
发生等等。
我尝试了以下内容:
fun1 <- function(x) 100*cumsum(x) / sum(x)
df[, percent := fun1(1:nrow(df)), by = df$individuals]
但它不起作用。我似乎需要按individuals
对我的数据框进行子集化,但我很难找到应该在哪里以及如何应对它。
答案 0 :(得分:2)
列都是factors
。我们只需要
df <- data.frame(measure, year, individuals)
而不是
df <- as.data.frame(cbind(measure, year, individuals))
在上面的代码中,它首先转换为matrix
(cbind
)。 matrix
只能容纳一个班级。由于“个人”列为character
,它会将整个matrix
转换为character
,当我们执行as.data.frame
(默认为stringsAsFactors = TRUE
)时character
列会转换为factor
。因此,请从data.frame
调用开始。
在代码的data.table
部分,未显示数据是否未转换为data.table
。 by
不需要df$
。此外,fun1
的参数应为seq
组,即seq_len(.N)
而不是整行数
library(data.table)
setDT(df)[, percent := fun1(seq_len(.N)), by = individuals]
head(df)
# measure year individuals percent
#1: 7.384682 2015 a 0.07843137
#2: 7.265650 2015 a 0.23529412
#3: 3.536816 2015 a 0.47058824
#4: 3.139754 2015 a 0.78431373
#5: 5.314709 2015 a 1.17647059
#6: 3.962159 2015 a 1.64705882
答案 1 :(得分:0)
你可以试试这个:
`
df$percent<-rep(0,nrow(df))
count<-0
for (i in 2:nrow(df)){
if (df[i,3]==df[i-1,3] && i!=nrow(df)){
df[i,4]<-df[i-1,4]+1
count<-count+1
}
else{
df[(i-1-count):(i-1),4]<-(df[(i-1-count):(i-1),4]/count)*100
df[i,4]<-0
count<-0
}
}
df
`
measure year individuals percent
1 3.54298117531633 2015 a 0.000000
2 6.76276664091015 2015 a 2.040816
3 4.940303054949 2015 a 4.081633
4 -0.274215381055852 2015 a 6.122449
5 3.85424764010803 2015 a 8.163265
46 6.48749027822134 2016 a 91.836735
47 4.92015417666705 2016 a 93.877551
48 2.56157340714661 2016 a 95.918367
49 7.0784144318028 2016 a 97.959184
50 2.36113372724998 2016 a 100.000000
51 8.39095200078212 2015 b 0.000000
52 6.23553126520668 2015 b 2.083333
53 6.03842048180984 2015 b 4.166667
54 7.26653490675355 2015 b 6.250000
55 7.91569540359305 2015 b 8.333333
56 3.01962780509906 2015 b 10.416667
57 2.56912081318865 2015 b 12.500000
58 1.67522578937297 2015 b 14.583333
59 1.25065179768467 2015 b 16.666667
60 4.90863986735939 2015 b 18.750000
61 6.89995323457065 2015 b 20.833333
97 4.4984459215344 2016 b 95.833333
98 6.08384989789474 2016 b 97.916667
99 1.4026759075611 2016 b 100.000000