【问题标题】:Use dplyr to change an R dataframe from second row across multiple columns使用 dplyr 从第二行跨多列更改 R 数据帧
【发布时间】:2019-03-15 04:08:12
【问题描述】:

我有一个类似于下面创建的玩具数据集的大型数据框

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 进行子集计算,然后从第二行到最后一行计算值,在所有情况下都忽略第一行

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

【问题讨论】:

  • 你能用玩具示例的预期输出更新你的帖子吗?
  • 已按要求进行编辑
  • 您能否解释计算A_Slope的规则是什么?我很难对您的代码进行去卷积,不幸的是,由于缺少任何缩进/空白/格式,它的可读性不太好。
  • 斜率这个术语只是一个名称——不要与微积分中的 dy/df 混淆。将添加几个 cmets

标签: r for-loop dplyr


【解决方案1】:

希望我已正确翻译了您的代码。

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

【讨论】:

  • 看起来正确。我需要澄清一下。 dplyr 会默认忽略第一行为 NA
  • @marciaakshayaLeo No..它不会,但因为我们在这里使用laglag 将默认的第一个值作为NA 和任何乘法/除法(我们在这里做的)完成使用NA 将导致NA 因此对于每个ID 的第一行,它的输出为NA
猜你喜欢
  • 2015-10-20
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-09
  • 2021-08-10
相关资源
最近更新 更多