Построить процентную последовательность на основе второго столбца - PullRequest
0 голосов
/ 29 мая 2018

У меня есть такой фрейм данных:

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)

Я хочу добавить столбец, отображающий процент nrow(df) в соответствии со столбцом «индивидуумы».То есть столбец, начинающийся с 0 и заканчивающийся на 100, когда он достигает последней строки, где встречается df$individuals == 'a'.Затем он должен начинаться до тех пор, пока не произойдет df$individuals == 'b' и т. Д.

Я попробовал следующее:

fun1 <- function(x) 100*cumsum(x) / sum(x)
df[, percent := fun1(1:nrow(df)), by = df$individuals]

, но это не работает.Кажется, мне нужно подмять свой фрейм данных на individuals, но я изо всех сил пытаюсь найти, где и как я должен к нему.

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Вы можете попробовать это:

`

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
0 голосов
/ 29 мая 2018

Все столбцы 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.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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...