Используйте dplyr для изменения фрейма данных R из второй строки в нескольких столбцах - PullRequest
0 голосов
/ 15 марта 2019

У меня есть большой фрейм данных, похожий на набор игрушечных данных, созданный ниже

df<-data.frame("ID"=c("A", "A", "A", "A", "A", "B", "B", "B", "B", "B"), 
'A_Frequency'=c(1,2,3,4,5,1,2,3,4,5), 'A_Axis'=c(1,2,3,4,5,1,2,3,4,5))

Фрейм данных состоит из столбца ID и двух столбцов A_Frequency и A_Axis.Я создал столбец с именем A_Slope и заполнил его следующим образом:рассчитывается от второго ряда к последнему, игнорируя первый ряд во всех случаях

for( j in id1){
for( i in 2:nrow(df[df$ID==df$ID[df$ID%in%j],])){
df$A_Slope[df$ID==df$ID[df$ID%in%j]][i]=10*log(2, 
10)*log((df$A_Axis[df$ID==df$ID[df$ID%in%j]][i])/

(df$A_Axis[df$ID==df$ID[df$ID%in%j]][i-1]), base = 
10)/log((df$A_Frequency[df$ID==df$ID[df$ID%in%j]] 
[i])/(df$A_Frequency[df$ID==df$ID[df$ID%in%j]][i-1]),base = 10 )}}

Это хорошо работает для игрушечного набора.У меня большой массив данных с несколькими столбцами.Можно ли использовать dplyr, чтобы сделать то же самое, используя mutate.

Ожидаемый результат

        ID A_Frequency A_Axis     A_Slope
     1   A           1      1          NA
     2   A           2      2 3.010299957
     3   A           3      3 3.010299957
     4   A           4      4 3.010299957
     5   A           5      5 3.010299957
     6   B           1      1          NA
     7   B           2      2 3.010299957
     8   B           3      3 3.010299957
     9   B           4      4 3.010299957
     10  B           5      5 3.010299957

Примечание: два значения NA в столбце A_Slope также могут быть нулевыми - необязательно NA

1 Ответ

1 голос
/ 15 марта 2019

Надеюсь, я правильно перевел ваш код.

library(dplyr)

df %>%
  group_by(ID) %>%
  mutate(A_Slope = 10 * log10(2) * log10(A_Axis/lag(A_Axis))/
                                    log10(A_Frequency/lag(A_Frequency)))


#  ID    A_Frequency A_Axis A_Slope
#  <fct>       <dbl>  <dbl>   <dbl>
# 1 A               1      1    NA   
# 2 A               2      2    3.01
# 3 A               3      3    3.01
# 4 A               4      4    3.01
# 5 A               5      5    3.01
# 6 B               1      1    NA   
# 7 B               2      2    3.01
# 8 B               3      3    3.01
# 9 B               4      4    3.01
#10 B               5      5    3.01

Некоторые указатели для понимания кода

  • log(x, 10) заменены на log10(x)
  • , чтобы получить предыдущее значение (i - 1), которое мы используем lag здесь.
...