簡體   English   中英

使用dplyr從第二行跨多個列更改R數據幀

[英]Use dplyr to change an R dataframe from second row across multiple columns

我有一個大型數據框,類似於下面創建的玩具數據集

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循環將其填充

id1<-unique(df$ID)###########Create list of unique IDs to subset the dataframe

在此循環中,我們計算A_Slope值,以便通過唯一ID將數據幀df替換為數據幀df,然后從第二行到最后一行計算值,而在所有情況下都忽略第一行

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

注意:A_Slope列中的兩個NA值也可以為零-不必要NA

希望我已經正確翻譯了您的代碼。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM