我想將一個資料框(左)轉換為另一個(右),但我不知道要執行此任務。簡而言之,A保留最接近的值 in并與 合并B。請花點時間幫助我!太感謝了!
原始資料框和轉換后的資料框(高亮背景)
這是原始資料。
df1 = data.frame(
ID = c(1,1,1,1,1,1,1,1,2,2,2,2,2),
TIME = c(-2, -1, 0, 11, 13, 24, 28, 36, -3, 0, 12, 13, 24),
A = c(30, 50, NA, 80, NA, NA, 30, NA, 20, NA, NA, 80, NA),
B = c(NA, NA, 2.0, NA, 2.5, 2.5, NA, 1.0, NA, 1.0, 1.0, NA, 2.5)
)
uj5u.com熱心網友回復:
library(tidyverse)
df <- df1 %>%
fill(A, .direction = c("down")) %>% # fill missing data in A
drop_na() %>%
rename(B = A, A = B) %>% # swap the names of columns A and B
select(ID, TIME, A, B) # select the order of columns
uj5u.com熱心網友回復:
這是一個解決方案。B在A用前一個值填充值后,它會保留具有非缺失值的行。然后是重新排列和重命名列的問題。
library(dplyr)
library(tidyr)
df1 %>%
group_by(ID) %>%
fill(A) %>%
ungroup() %>%
na.omit() %>%
rename(B = A, A = B) %>%
relocate(B, .after = A)
## A tibble: 7 x 4
# ID TIME A B
# <dbl> <dbl> <dbl> <dbl>
#1 1 0 2 50
#2 1 13 2.5 80
#3 1 24 2.5 80
#4 1 36 1 30
#5 2 0 1 20
#6 2 12 1 20
#7 2 24 2.5 80
編輯
TarJae 的評論使上面的代碼更短:
df1 %>%
fill(A) %>%
select(ID, TIME, A=B, B=A) %>%
drop_na()
uj5u.com熱心網友回復:
這是我們如何做到的基本 R 方法:
# swap A and B
df1[ , c(3,4)] <- df1[ , c(4,3)]
# fill na with prvious value from above
df1$B <- na.omit(df1$B)[cumsum(!is.na(df1$B))]
# remove NA
df1[complete.cases(df1$A),]
ID TIME A B
3 1 0 2.0 50
5 1 13 2.5 80
6 1 24 2.5 80
8 1 36 1.0 30
10 2 0 1.0 20
11 2 12 1.0 20
13 2 24 2.5 80
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/399311.html
上一篇:我想保存不同資料框列集的平均值(按行)并將它們存盤在新的資料框中
下一篇:迭代串列以創建df
