2015-10-14 15 views
5

Tôi có một df khung dữ liệu cho báo cáo trong định dạng RTF như:Bỏ qua giá trị trong RTF báo cáo

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 

tôi muốn in nó như:

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 

bất cứ ai có thể giúp tôi xin vui lòng.

+0

Hi akrun, cảm ơn bạn đã giúp đỡ của bạn. Bạn có thể vui lòng đưa ra ví dụ cho chỉ biến ATRSLBL. Nó sẽ giúp tôi hiểu rõ hơn –

Trả lời

3

Dưới đây là một cách với dplyr. Tôi không chắc chắn nếu ATRSLBL là ký tự hoặc yếu tố. Giả định của tôi là nó là một yếu tố. Trước tiên, tôi đã chuyển đổi ATRSLBL thành ký tự. Sau đó, tôi đã thay thế được sao chép RedBlue bằng "". Tôi cũng đã tạo biến nhóm bằng cách sử dụng cumsum() trong phần mutate() đầu tiên. Sử dụng biến nhóm, tôi đã nhóm dữ liệu và áp dụng replace() cho CENTRE. Ở đây, tôi đang nói R nếu số hàng của mỗi nhóm không phải là 1, thay thế bất kỳ ký tự nào thành "". Do đó, bạn giữ thông tin trong hàng đầu tiên của mỗi nhóm. Sau đó, bạn hủy nhóm dữ liệu và xóa biến nhóm bằng cách sử dụng select(). Tôi hy vọng điều này sẽ giúp bạn.

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 

DỮ LIỆU

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

Cảm ơn @jazzurro. Nó thực sự hữu ích. –

+0

@AbuNoman Pleasure. :) – jazzurro

+0

Bạn có thể vui lòng cho tôi biết nếu TRUNG TÂM là một nhân vật thì thủ tục sẽ là gì. Cảm ơn. –

3

Chúng tôi có thể thực hiện việc này với data.table. Chúng tôi chuyển đổi 'data.frame' thành 'data.table' (setDT(df)), Chúng tôi nhận chỉ mục hợp lý của duplicated 'ATRSLBL' và chỉ định (:=) cho số ''. Chúng tôi tạo ra các biến nhóm (cumsum(ATRSLBL !='')), và nhận được chỉ số hàng duplicated 'CENTER', sử dụng danh mục đó để gán 'CENTER' để '' sau khi chuyển đổi cột 'CENTER' thành 'nhân vật'

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 

LƯU Ý: Ở đây tôi giả định cột 'ATRSLBL' là character lớp.

+0

@Pascal Có, bạn nói đúng. Tôi đã sử dụng dữ liệu khác nhau earlie – akrun

+0

Cảm ơn @akrun. Nó thực sự hữu ích. –

Các vấn đề liên quan