[英]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.