跳过RTF报告中的值

时间:2015-10-14 09:29:54

标签: r

我有一个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

任何人都可以帮助我。

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))