我有数据(从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的想法可以是,
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
您也可以这样做:
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
为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