如何将“标题”行转换为新列

问题描述 投票:1回答:3

我有数据(从PDF中不完美地导入),所有数据都放在一个列中,其中某些行作为描述性标题。例如:

dfx <- data.frame(V1 = c("Box 1", "abcd10", "bcde15", "Box 2", "cdefg35", "jklm40", "nopq50", "rstu52"))

       V1
1   Box 1
2  abcd10
3  bcde15
4   Box 2
5 cdefg35
6  jklm40
7  nopq50
8  rstu52

我想创建一个单独的列,其中每个观察值都采用其上方最近的标题的值。像这样:

       V1    v2
1  abcd10 Box 1
2  bcde15 Box 1
3 cdefg35 Box 2
4  jklm40 Box 2
5  nopq50 Box 2
6  rstu52 Box 2

[我尝试过的一切都没有使我靠近。任何帮助,将不胜感激。谢谢!

r multiple-columns
3个回答
1
投票

通过底数R的想法可以是,

i1 <- grepl('Box', dfx$V1)
dfx$new <- with(dfx, ave(V1, cumsum(i1), FUN = function(i) i[1]))
subset(dfx, !i1)

#       V1   new
#2  abcd10 Box 1
#3  bcde15 Box 1
#5 cdefg35 Box 2
#6  jklm40 Box 2
#7  nopq50 Box 2
#8  rstu52 Box 2

0
投票

您也可以这样做:

 indx <- grepl("^Box \\d+$",dfx$V1)
 transform(dfx,v2=V1[indx][cumsum(indx)])[!indx,]
       V1    v2
2  abcd10 Box 1
3  bcde15 Box 1
5 cdefg35 Box 2
6  jklm40 Box 2
7  nopq50 Box 2
8  rstu52 Box 2

0
投票

为Box行创建一个V2列,使其等于V1列,其他行等于NA列,然后使用na.locf0填写NA。最后删除V1框行。

library(zoo)

isBox <- grepl("Box", dfx$V1)
transform(dfx, V2 = na.locf0(ifelse(isBox, as.character(V1), NA)))[!isBox, ]

给予:

       V1    V2
2  abcd10 Box 1
3  bcde15 Box 1
5 cdefg35 Box 2
6  jklm40 Box 2
7  nopq50 Box 2
8  rstu52 Box 2
© www.soinside.com 2019 - 2024. All rights reserved.