根据第二列构建百分比序列

时间:2018-05-29 14:11:02

标签: r function dataframe sequence

我有一个这样的数据框:

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对我的数据框进行子集化,但我很难找到应该在哪里以及如何应对它。

2 个答案:

答案 0 :(得分:2)

列都是factors。我们只需要

df <-  data.frame(measure, year, individuals)

而不是

df <- as.data.frame(cbind(measure, year, individuals))

在上面的代码中,它首先转换为matrixcbind)。 matrix只能容纳一个班级。由于“个人”列为character,它会将整个matrix转换为character,当我们执行as.data.frame(默认为stringsAsFactors = TRUE)时character列会转换为factor。因此,请从data.frame调用开始。

在代码的data.table部分,未显示数据是否未转换为data.tableby不需要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