我面臨著凌亂的資料。我遇到的一個特殊問題是某些值隱藏在某些變數中,將表子集為某種“標題”。
一個例子:
df <- data.frame(
a = c("header1", "value", "value", "header2", "value", "value"),
b = c(1, 2, 3, 4, 5, 6)
)
我大致想要的:
df_goal <- data.frame(
a = c("header1", "value", "value", "header2", "value", "value"),
b = c(1, 2, 3, 4, 5, 6),
c = c("header1", "header1", "header1", "header2", "header2", "header2")
)
所以它基本上是關于根據“標題”的位置操作資料。
編輯
到目前為止,答案圍繞遵循某種模式的“標題”展開,例如“標題 1”等。在這種情況下,它們作業得很好。
但是,我想提出一個更通用的解決方案,其中“標題”是任意的,例如“fererfw”和“ewetwet”而不是上面示例中的“header1”和“header2”。
uj5u.com熱心網友回復:
這是否有效:
library(dplyr)
library(stringr)
df %>% mutate(x = cumsum(str_detect(a,'header'))) %>% group_by(x) %>%
mutate(c = str_c('header',x)) %>% ungroup() %>% select(-x)
# A tibble: 6 x 3
a b c
<chr> <dbl> <chr>
1 header1 1 header1
2 value 2 header1
3 value 3 header1
4 header2 4 header2
5 value 5 header2
6 value 6 header2
uj5u.com熱心網友回復:
您可以將它用于zoo::na.locf:
df$c <- zoo::na.locf(ifelse(grepl('(header\\d )', df$a), df$a, NA))
輸出:
> df
a b c
1 header1 1 header1
2 value 2 header1
3 value 3 header1
4 header2 4 header2
5 value 5 header2
6 value 6 header2
>
編輯:
通過您編輯的任意標題,請嘗試:
df$c <- zoo::na.locf(ifelse(grepl('(\\w \\d )', df$a), df$a, NA))
uj5u.com熱心網友回復:
如果標頭是任意的,其中沒有任何模式,那么您可以創建一個已知標頭的向量,將剩余的值替換為NA并使用tidyr::fill。
library(dplyr)
library(tidyr)
headers <- c('header1', 'header2')
df %>%
mutate(c = replace(a, !a %in% headers, NA)) %>%
fill(c)
# a b c
#1 header1 1 header1
#2 value 2 header1
#3 value 3 header1
#4 header2 4 header2
#5 value 5 header2
#6 value 6 header2
uj5u.com熱心網友回復:
遲到了,但這里有一個無依賴的解決方案:
df$c <-
rep(
grep('^header', df$a, value = TRUE),
rle(cumsum(grepl('^header', df$a)))$lengths
)
# a b c
# 1 header1 1 header1
# 2 value 2 header1
# 3 value 3 header1
# 4 header2 4 header2
# 5 value 5 header2
# 6 value 6 header2
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/326969.html
標籤:r
