我有一个RTF格式的报告数据框df:
df <-
ATRSLBL POPUL CENTRE BAGE BAGEC1 SEX
Red PPS 37201 75 3 1
Red PPS 37201 71 2 2
Red PPS 37201 73 2 1
Red PPS 38201 66 2 2
Blue PPS 37201 78 3 2
Blue PPS 38201 71 2 2
Blue PPS 38201 71 2 1
Blue PPS 38201 64 1 2
我想将其打印为:
ATRSLBL POPUL CENTRE BAGE BAGEC1 SEX
Red PPS 37201 75 3 1
PPS 71 2 2
PPS 73 2 1
PPS 38201 66 2 2
Blue PPS 37201 78 3 2
PPS 38201 71 2 2
PPS 71 2 1
PPS 64 1 2
任何人都可以帮助我。
答案 0 :(得分:3)
我们可以使用data.table
执行此操作。我们将'data.frame'转换为'data.table'(setDT(df)
),我们获得duplicated
'ATRSLBL'的逻辑索引并将其分配(:=
)到{{1 }}。我们创建分组变量(''
),并获取cumsum(ATRSLBL !='')
'CENTER'的行索引,在将'CENTER'列转换为'{1}}后,使用该索引将'CENTER'指定给duplicated
'字符'
''
注意:这里我假设'ATRSLBL'列为library(data.table)
setDT(df)[duplicated(ATRSLBL), ATRSLBL := '']
i1 <- df[, .I[duplicated(CENTRE)] , cumsum(ATRSLBL!='')]$V1
df[, CENTRE:= as.character(CENTRE)][i1, CENTRE:= '']
df
# ATRSLBL POPUL CENTRE BAGE BAGEC1 SEX
#1: Red PPS 37201 75 3 1
#2: PPS 71 2 2
#3: PPS 73 2 1
#4: PPS 38201 66 2 2
#5: Blue PPS 37201 78 3 2
#6: PPS 38201 71 2 2
#7: PPS 71 2 1
#8: PPS 64 1 2
类。
答案 1 :(得分:3)
这是dplyr
的一种方式。我不确定ATRSLBL
是否是字符或因素。我的假设是它是一个因素。首先,我将ATRSLBL
转换为角色。然后,我用Red
替换了重复的Blue
和""
。我还在第一个cumsum()
部分使用mutate()
创建了一个组变量。使用组变量,我对数据进行了分组,并为replace()
应用了CENTRE
。在这里,我告诉R如果每个组的行号不是1,则将任何字符替换为""
。因此,您将信息保存在每个组的第一行中。然后,您使用select()
取消组合数据并降低组变量。我希望这会对你有所帮助。
library(dplyr)
mutate(mydf,
ATRSLBL = replace(as.character(ATRSLBL), which(duplicated(ATRSLBL) == TRUE), ""),
group = cumsum(c(T, abs(diff(CENTRE)) > 1))) %>%
group_by(group) %>%
mutate(CENTRE = replace(CENTRE, which(row_number(CENTRE) != 1), "")) %>%
ungroup %>%
select(-group)
# ATRSLBL POPUL CENTRE BAGE BAGEC1 SEX
# (chr) (fctr) (chr) (int) (int) (int)
#1 Red PPS 37201 75 3 1
#2 PPS 71 2 2
#3 PPS 73 2 1
#4 PPS 38201 66 2 2
#5 Blue PPS 37201 78 3 2
#6 PPS 38201 71 2 2
#7 PPS 71 2 1
#8 PPS 64 1 2
数据强>
mydf <- structure(list(ATRSLBL = structure(c(2L, 2L, 2L, 2L, 1L, 1L,
1L, 1L), .Label = c("Blue", "Red"), class = "factor"), POPUL = structure(c(1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "PPS", class = "factor"),
CENTRE = c(37201L, 37201L, 37201L, 38201L, 37201L, 38201L,
38201L, 38201L), BAGE = c(75L, 71L, 73L, 66L, 78L, 71L, 71L,
64L), BAGEC1 = c(3L, 2L, 2L, 2L, 3L, 2L, 2L, 1L), SEX = c(1L,
2L, 1L, 2L, 2L, 2L, 1L, 2L)), .Names = c("ATRSLBL", "POPUL",
"CENTRE", "BAGE", "BAGEC1", "SEX"), class = "data.frame", row.names = c(NA,
-8L))