這個問題在這里已經有了答案: 填寫資訊后洗掉特定行 1個回答 4 分鐘前關閉。
我有一個類似于這種格式的 R 資料框:
df<-data.frame(
Fruit=c("Apples","Apples","Apples","Bananas","Bananas","Bananas","Bananas","Bananas","Bananas","Bananas","Bananas","Bananas","Cherries","Cherries","Cherries"),
Order=c("A","A","A","B","B","B","B","B","B","B","B","B","B","B","B"),
Producer_ID=c("V","V","V","W","W","W","X","X","X","Y","Y","Y","Z","Z","Z"),
x1=c( 0.7975,NA,NA,0.570975,NA,NA,0.43374375,NA,NA,0.610624,NA,NA,0.6975,NA,NA),
y1=c( 200,NA,NA,200,NA,NA,200,NA,NA,200,NA,NA,200,NA,NA),
x2=c( NA,NA,0.82,NA,NA,0.51,NA,NA,0.415,NA,NA,0.542,NA,NA,0.62),
y2=c( NA,NA,200,NA,NA,200,NA,NA,200,NA,NA,200,NA,NA,200),
x3=c( NA,NA,0.82,NA,NA,0.505,NA,NA,0.4125,NA,NA,0.538,NA,NA,0.62),
y3=c( NA,NA,200,NA,NA,200,NA,NA,200,NA,NA,200,NA,NA,200),
x4=c( NA,0.82,NA,NA,NA,0.5,NA,NA,0.41,NA,NA,0.534,NA,NA,0.62),
y4=c( NA,300,NA,NA,NA,200,NA,NA,200,NA,NA,200,NA, NA,200),
x5=c( NA,0.82,NA,NA,NA,0.495,NA,NA,0.4075,NA,NA,0.53,NA,0.62,NA),
y5=c( NA,300,NA,NA,NA,200,NA,NA,200,NA,NA,200,NA,300,NA),
x6=c( NA,0.82,NA,NA,0.49,NA,NA,0.405,NA,NA,0.52,NA,NA,0.62,NA),
y6=c( NA, 300,NA,NA,300,NA,NA,300,NA,NA,300,NA,NA,300,NA)
)
輸出:
> df
Fruit Order Producer_ID x1 y1 x2 y2 x3 y3 x4 y4 x5 y5 x6 y6
1 Apples A V 0.7975000 200 NA NA NA NA NA NA NA NA NA NA
2 Apples A V NA NA NA NA NA NA 0.820 300 0.8200 300 0.820 300
3 Apples A V NA NA 0.820 200 0.8200 200 NA NA NA NA NA NA
4 Bananas B W 0.5709750 200 NA NA NA NA NA NA NA NA NA NA
5 Bananas B W NA NA NA NA NA NA NA NA NA NA 0.490 300
6 Bananas B W NA NA 0.510 200 0.5050 200 0.500 200 0.4950 200 NA NA
7 Bananas B X 0.4337437 200 NA NA NA NA NA NA NA NA NA NA
8 Bananas B X NA NA NA NA NA NA NA NA NA NA 0.405 300
9 Bananas B X NA NA 0.415 200 0.4125 200 0.410 200 0.4075 200 NA NA
10 Bananas B Y 0.6106240 200 NA NA NA NA NA NA NA NA NA NA
11 Bananas B Y NA NA NA NA NA NA NA NA NA NA 0.520 300
12 Bananas B Y NA NA 0.542 200 0.5380 200 0.534 200 0.5300 200 NA NA
13 Cherries B Z 0.6975000 200 NA NA NA NA NA NA NA NA NA NA
14 Cherries B Z NA NA NA NA NA NA NA NA 0.6200 300 0.620 300
15 Cherries B Z NA NA 0.620 200 0.6200 200 0.620 200 NA NA NA NA
對于識別符號列“Fruit”、“Order”、“Producer”的每種組合,在剩余的每一列中都恰好有一個非 NA 值。我想要做的是整理我的資料框以消除 NA 值,將非 NA 值與其識別符號對齊,如下所示:
df_final<-data.frame(
Fruit=c("Apples","Bananas","Bananas","Bananas","Cherries"),
Order=c("A","B","B","B","B"),
Producer_ID=c("V","W","X","Y","Z"),
x1=c(0.7975,0.570975,0.43374375,0.610624,0.6975),
y1=c(200,200,200,200,200),
x2=c(0.82,0.51,0.415,0.542,0.62),
y2=c(200,200,200,200,200),
x3=c(0.82,0.505,0.4125,0.538,0.62),
y3=c(200,200,200,200,200),
x4=c(0.82,0.5,0.41,0.534,0.62),
y4=c(300,200,200,200,200),
x5=c(0.82,0.495,0.4075,0.53,0.62),
y5=c(300,200,200,200,300),
x6=c(0.82,0.49,0.405,0.526,0.62),
y6=c(300,300,300,300,300)
)
最終輸出:
> df_final
Fruit Order Producer_ID x1 y1 x2 y2 x3 y3 x4 y4 x5 y5 x6 y6
1 Apples A V 0.7975000 200 0.820 200 0.8200 200 0.820 300 0.8200 300 0.820 300
2 Bananas B W 0.5709750 200 0.510 200 0.5050 200 0.500 200 0.4950 200 0.490 300
3 Bananas B X 0.4337437 200 0.415 200 0.4125 200 0.410 200 0.4075 200 0.405 300
4 Bananas B Y 0.6106240 200 0.542 200 0.5380 200 0.534 200 0.5300 200 0.526 300
5 Cherries B Z 0.6975000 200 0.620 200 0.6200 200 0.620 200 0.6200 300 0.620 300
uj5u.com熱心網友回復:
Fruit由于您在一組 ( ,Order和)的每一列中只有一個值,因此Producer_ID您可以忽略sum( 或max) 每列的NA值。
在基礎 R 中aggregate-
aggregate(.~Fruit Order Producer_ID, df, sum, na.rm = TRUE, na.action = NULL)
# Fruit Order Producer_ID x1 y1 x2 y2 x3 y3 x4 y4 x5 y5 x6 y6
#1 Apples A V 0.7975000 200 0.820 200 0.8200 200 0.820 300 0.8200 300 0.820 300
#2 Bananas B W 0.5709750 200 0.510 200 0.5050 200 0.500 200 0.4950 200 0.490 300
#3 Bananas B X 0.4337437 200 0.415 200 0.4125 200 0.410 200 0.4075 200 0.405 300
#4 Bananas B Y 0.6106240 200 0.542 200 0.5380 200 0.534 200 0.5300 200 0.520 300
#5 Cherries B Z 0.6975000 200 0.620 200 0.6200 200 0.620 200 0.6200 300 0.620 300
或使用dplyr-
library(dplyr)
df %>%
group_by(Fruit, Order ,Producer_ID) %>%
summarise(across(x1:y6, sum, na.rm = TRUE))
uj5u.com熱心網友回復:
另一種選擇是使用tidyr重塑為長格式,擺脫 NA,最后重塑回寬格式。
注意:作為中間步驟,我使用arrange(gsub("^.*?(\\d)$", "\\1", name))重新排列資料,以便寬 df 中的列按您想要的順序排序。
library(tidyr)
library(dplyr)
df %>%
pivot_longer(-c(Fruit, Order, Producer_ID)) %>%
drop_na() %>%
arrange(gsub("^.*?(\\d)$", "\\1", name)) %>%
pivot_wider(names_from = "name", values_from = "value")
#> # A tibble: 5 × 15
#> Fruit Order Producer_ID x1 y1 x2 y2 x3 y3 x4 y4 x5
#> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 Apples A V 0.798 200 0.82 200 0.82 200 0.82 300 0.82
#> 2 Banan… B W 0.571 200 0.51 200 0.505 200 0.5 200 0.495
#> 3 Banan… B X 0.434 200 0.415 200 0.412 200 0.41 200 0.408
#> 4 Banan… B Y 0.611 200 0.542 200 0.538 200 0.534 200 0.53
#> 5 Cherr… B Z 0.698 200 0.62 200 0.62 200 0.62 200 0.62
#> # … with 3 more variables: y5 <dbl>, x6 <dbl>, y6 <dbl>
uj5u.com熱心網友回復:
與@Ronak Shah 類似sum,這是一種可選方法,sort用于在同一行中聚合所有非 NA 值(受@r2evans https://stackoverflow.com/a/70772167/7522764啟發)
df |>
mutate(across(everything(), ~ sort(., na.last = TRUE))) |>
na.omit()
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/418593.html
標籤:
上一篇:itext7:InvalidCastException:無法將iText.Html2pdf.Attach.Impl.Layout.HtmlPageBreak型別的物件轉換為iText.Layout.E
