簡體   English   中英

根據其他數據框的變量條件創建新數據框

[英]create new data frame based on variables conditions of other data frame

我正在嘗試使用 R 從更大的數據框中創建一個新的數據框。 這是我的大數據框的簡短版本:

 df <- data.frame(time = c(0,1,5,10,12,13,20,22,25,30,32,35,39),
             t_0_1 = c(20,20,20,120,300,350,400,600,700,100,20,20,20),
             t_0_2 = c(20,20,20,20,120,300,350,400,600,700,100,20,20),
             t_2_1 = c(20,20,20,20,20,120,300,350,400,600,700,100,20),
             t_2_2 = c(20,20,20,20,120,300,350,400,600,700,100,20,20))

新數據框應將第一個變量值作為大數據框變量名稱(1 和 2)末尾的數字。 其他變量名稱應該是大數據框變量(0 和 2)中間的數字,對於它們的值,我試圖為每個變量過濾大於 300 的值並計算時間差。 例如對於變量“t_0_1”,值大於 300 的時間是 13 到 25 秒。 所以新數據框中的值應該是 12。

新的數據框應如下所示:

df_new <- data.frame(height= c(1,2),
                     "0" = c(12,10),
                     "2" = c(10,10))

非常歡迎我應該從哪里開始或如何做到這一點的任何幫助。 謝謝!!

這是一個tidyverse的解決方案

library(tidyverse)
df %>%
    pivot_longer(-time) %>%
    separate(name, c(NA, "col", "height"), sep = "_") %>%
    pivot_wider(names_from = "col", names_prefix = "X") %>%
    group_by(height) %>%
    summarise(
        across(starts_with("X"), ~ sum(diff(time[.x > 300]))), 
        .groups = "drop")
## A tibble: 2 x 3
#  height    X0    X2
#  <chr>  <dbl> <dbl>
#1 1         12    10
#2 2         10    10

說明:這個想法是從寬到長重塑,將列名分成(未來)列名"col""height" 通過從"col" (以“X”為前綴)獲取列名並根據您的要求進行匯總(即僅保留值> 300 的條目,並對時間差求和),從長到寬重塑。

您可以使用summarise(across(...))計算每列的時間差,然后將數據轉換為 long。

library(tidyverse)

df %>%
  summarise(across(-time, ~ sum(diff(time[.x > 300])))) %>%
  pivot_longer(everything(), names_to = c(".value", "height"), names_pattern = "t_(.+)_(.+)")

# # A tibble: 2 × 3
#   height   `0`   `2`
#   <chr>  <dbl> <dbl>
# 1 1         12    10
# 2 2         10    10

暫無
暫無

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

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