我有一個看起來像這樣的資料框:
df <- data.frame(col1=c(NA, NA),
col2=c("arroz", "unit"),
col3=c(NA, "area"),
col4=c("arveja", "unit"),
col5=c(NA, "area"),
col6=c("frejol", "unit"),
col7=c(NA, "area"))
col1 col2 col3 col4 col5 col6 col7
1 NA arroz <NA> arveja <NA> frejol <NA>
2 NA unit area unit area unit area
如您所見,第一行有 NA。我想復制非 NA 單元格的內容并將其粘貼到右側的 NA 單元格中,以便獲得這樣的 df;第一列必須保持為 NA:
df_output <- data.frame(col1=c(NA, NA),
col2=c("arroz", "unit"),
col3=c("arroz", "area"),
col4=c("arveja", "unit"),
col5=c("arveja", "area"),
col6=c("frejol", "unit"),
col7=c("frejol", "area"))
col1 col2 col3 col4 col5 col6 col7
1 NA arroz arroz arveja arveja frejol frejol
2 NA unit area unit area unit area
這是來自更大資料集的玩具示例。
謝謝!!
uj5u.com熱心網友回復:
library(tidyverse)
df <- data.frame(col1=c(NA, NA),
col2=c("arroz", "unit"),
col3=c(NA, "area"),
col4=c("arveja", "unit"),
col5=c(NA, "area"),
col6=c("frejol", "unit"),
col7=c(NA, "area")) %>%
as_tibble()
df %>%
pivot_longer(-col1) %>%
fill(value) %>%
pivot_wider(names_from = name, values_from = value) %>%
unnest()
# A tibble: 2 x 7
col1 col2 col3 col4 col5 col6 col7
<lgl> <chr> <chr> <chr> <chr> <chr> <chr>
1 NA arroz arroz arveja arveja frejol frejol
2 NA unit area unit area unit area
uj5u.com熱心網友回復:
一種可能性是使用Reduce這些replace值NA。
df[] <- Reduce(function(x, y) {i <- is.na(y); replace(y, i, x[i])},
df, accumulate = TRUE)
df
# col1 col2 col3 col4 col5 col6 col7
#1 NA arroz arroz arveja arveja frejol frejol
#2 NA unit area unit area unit area
基準
bench::mark(check = FALSE
, "tidyverse" = {
df %>%
pivot_longer(-col1) %>%
fill(value) %>%
pivot_wider(names_from = name, values_from = value) %>%
unnest()
}
, "zoo" = setNames(data.frame(t(apply(df, 1, na.locf0))), colnames(df))
, "Reduce" = Reduce(function(x, y) {i <- is.na(y); replace(y, i, x[i])},
df, accumulate = TRUE)
)
# expression min median `itr/sec` mem_alloc `gc/sec` n_itr n_gc total_time
# <bch:expr> <bch:t> <bch:t> <dbl> <bch:byt> <dbl> <int> <dbl> <bch:tm>
#1 tidyverse 26.2ms 26.7ms 37.3 104KB 6.99 16 3 429ms
#2 zoo 277.9μs 292.7μs 3383. 0B 8.23 1644 4 486ms
#3 Reduce 33.8μs 36.4μs 26973. 11KB 10.8 9996 4 371ms
Reduce 比 zoo 快 8 倍,比 tidyverse 快 700 倍。
uj5u.com熱心網友回復:
您可以使用apply以下na.locf0代碼對所有行進行操作:
library(zoo)
setNames(data.frame(t(apply(df, 1, na.locf0))), colnames(df))
輸出:
col1 col2 col3 col4 col5 col6 col7
1 <NA> arroz arroz arveja arveja frejol frejol
2 <NA> unit area unit area unit area
uj5u.com熱心網友回復:
您可以將行滯后一列并在以前的NA索引處分配。
nas <- is.na(df[1, ])
df[1, nas] <- c(NA, unlist(df[1, -ncol(df)]))[nas]
df
# col1 col2 col3 col4 col5 col6 col7
# 1 <NA> arroz arroz arveja arveja frejol frejol
# 2 <NA> unit area unit area unit area
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/496598.html
上一篇:資料框和日期時間
下一篇:重塑資料框并將值轉換為列
