【问题标题】:Calculating the peak function for group wise(Tag) in a data frame and further Rbinding it into new data frame计算数据帧中分组明智(标签)的峰值函数,并进一步将其绑定到新数据帧中
【发布时间】:2021-03-26 05:53:59
【问题描述】:

我是在 Stack 上提问的新手,所以如果我弄错了,请原谅我。这是场景(我试图用一个简单的例子重现它):

library("pracma") 
Tag<- c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3,
    3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5,5, 5,
    6, 6, 6, 6, 6, 6, 6, 6, 6, 6)
Temp<- c(43, 44, 45, 41, 43, 38, 40, 41, 39, 37, 37, 39, 45, 42, 41, 43, 44, 39,38,
     37, 43, 44, 45, 41, 43, 38, 40, 41, 39, 37, 37, 39, 45, 42, 41, 43, 44, 
     39, 38, 37, 43, 44, 45, 41, 43, 38, 40, 41, 39, 37, 37, 39, 45, 42, 41,43,
     44, 39, 38, 37)
dfr=data.frame(Tag=Tag,Temp=Temp)

数据描述 - 我们有两列:
标签 [分组变量]
Temp(峰值的数值变量功能必须执行)

for (i in 1:6) {

df=filter(dfr , dfr$Tag == i)
pik =findpeaks(df$Temp, nups = 1, ndowns = 0, zero = "+", peakpat = NULL,
             minpeakheight = 33, minpeakdistance = 4,
             threshold =0.42, npeaks = 11, sortstr = FALSE)#Peak Function

pik<- as.data.frame(pik)#Converting into data frame as it is in matrix form
names(pik) <- c("Temp","Peak_Mid","Peak_start","Peak_End")# renaming the header
pik <- arrange(pik , Peak_Mid)#Rearranging with Peak_Mid
attach(pik)#attaching pik df 
j=1#initializing for loop
s=0#initializing for loop
for (j in 1:nrow(pik))#for loop for calculating slope individual points
s[[j]]=((Temp[j+1]-Temp[j])/(Peak_Mid[j+1]-Peak_Mid[j]))
pik$Trend <- 0#creating new column(Trend) filled with zero
pik$Trend <- s# inserting the calculated s variable onto pik df 
w[[i]]=as.data.frame(pik) 
}

我试图将上面的代码变成一个for 循环,这样在每个ith 值i:e(Tag[i] 在我们的例子中i 根据我们的数据范围从1到6) .所以每次Tag[i]都会通过peak函数计算,然后我们会计算点之间的斜率,我们会得到一个新的4列数据框。

此计算将在每个 Tag[i] 上执行,这是主数据帧的子集。所以,我们会得到i不同的数据帧,这些数据帧会被rbind加上tag no。

这是输入与预期输出的视觉效果:

【问题讨论】:

    标签: r


    【解决方案1】:

    使用tidyverselibrary 我们可以做到:

    result <- dfr %>% 
        split(.$Tag) %>% 
        map(~findpeaks(.$Temp, nups = 1, ndowns = 0, zero = "+", peakpat = NULL, minpeakheight = 33, minpeakdistance = 4, threshold = 0.42, npeaks = 11, sortstr = FALSE)) %>% 
        map_df(~data_frame(Temp = parse_number(.x[,1]), 
                        Peak_Mid = parse_number(.x[,2]),
                        Peak_start = parse_number(.x[,3]),
                        Peak_End= parse_number(.x[,4])),
               .id = 'Tag') %>% 
        arrange(Tag, Peak_Mid) %>% 
        group_by(Tag) %>% 
        mutate(Trend= (lead(Temp)-Temp)/(lead(Peak_Mid)-Peak_Mid))
    

    这将按顺序:

    1. 根据Tag 值将原始dataset 拆分为datasetslist。 (split)
    2. 对于列表中的每个dataset,使用提供的参数执行findpeaks 函数,结果是matrix。 (map)
    3. 对于每个matix 转换为data.frame,重命名。 (data_frame)
    4. 减少到单个data.frame。 (map_df)
    5. 按所需顺序排列。 (arrange)
    6. 计算Trent 列。 (mutate)

    希望对你有帮助

    更新

    截至 2021 年,map_df 调用应重写为:

    map_df(~tibble(
        Temp = .x[,1],
        Peak_mid = .x[,2],
        Peak_start = .x[,3],
        Peak_End = .x[,4]),
      .id = "Tag")
    

    【讨论】:

    • 它给出一个错误 function_list[[i]](value) 中的错误:找不到函数“map”
    • 添加了库加载,也去掉了多余的括号,现在检查一下
    • install.packages 中的警告:包“purr”不可用(对于 R 版本 3.3.2)...这是任何替代方案的问题
    • 它是purrr 和 3 个r,但你应该安装并加载tidyverse(它是一个包的集合)
    • 成功了吗?如果确实对您有所帮助,请考虑接受并支持答案
    猜你喜欢
    • 2015-10-11
    • 2021-12-02
    • 2021-07-25
    • 2021-02-02
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    相关资源
    最近更新 更多