2014-12-07 15 views
14

Tôi đang gặp khó khăn với các nhãn biến của cột data.frame. Nói rằng tôi có một khung dữ liệu như thế này (một phần của khung dữ liệu lớn hơn nhiều):R: Chỉ định các nhãn biến của cột khung dữ liệu

data <- data.frame(age = c(21, 30, 25, 41, 29, 33), sex = factor(c(1, 2, 1, 2, 1, 2), labels = c("Female", "Male"))) 

Tôi cũng có một vector được đặt tên với các nhãn biến cho dữ liệu này:

var.labels <- c(age = "Age in Years", sex = "Sex of the participant") 

Những gì tôi muốn làm là gán các nhãn biến trong var.labels cho các cột trong khung dữ liệu data bằng cách sử dụng hàm label từ gói Hmisc. Tôi có thể làm từng cái một như thế này và kiểm tra kết quả sau:

> label(data[["age"]]) <- "Age in years" 
> label(data[["sex"]]) <- "Sex of the participant" 
> label(data) 
       age      sex 
     "Age in years" "Sex of the participant" 

Các nhãn biến được phân công như là thuộc tính của các cột:

> attr(data[["age"]], "label") 
[1] "Age in years" 
> attr(data[["sex"]], "label") 
[1] "Sex of the participant" 

tuyệt vời. Tuy nhiên, với khung dữ liệu lớn hơn, hãy nói 100 cột trở lên, điều này sẽ không thuận tiện hoặc hiệu quả. Một điều tôi có thể dễ dàng làm là chỉ định chúng trực tiếp với các thuộc tính:

> attr(data, "variable.labels") <- var.labels 

Không được trợ giúp. Các nhãn biến không được gán vào các cột:

> label(data) 
age sex 
"" "" 

Thay vào đó, họ được giao nhiệm vụ như một thuộc tính của khung dữ liệu riêng của mình (xem phần cuối cùng của danh sách):

> attributes(data) 
$names 
[1] "age" "sex" 

$row.names 
[1] 1 2 3 4 5 6 

$class 
[1] "data.frame" 

$variable.labels 
       age      sex 
     "Age in Years" "Sex of the participant" 

Và đây là không phải những gì tôi muốn. Tôi cần các nhãn biến làm thuộc tính của các cột. Tôi cố gắng để viết hàm sau (và nhiều người khác):

set.var.labels <- function(dataframe, label.vector){ 
    column.names <- names(dataframe) 
    dataframe <- mapply(label, column.names, label.vector) 
    return(dataframe) 
} 

Và hơn thực hiện nó:

> set.var.labels(data, var.labels) 

Không giúp đỡ. Nó trả về các giá trị của vector var.labels, nhưng không gán các nhãn biến. Nếu tôi cố gắng gán nó cho một đối tượng mới, nó chỉ chứa các giá trị của các nhãn biến là một vectơ.

Trả lời

15

Bạn có thể gán các nhãn sử dụng lapply:

var.labels = c(age="Age in Years", sex="Sex of the participant") 

label(data) = lapply(names(var.labels), 
        function(x) label(data[,x]) = var.labels[x]) 

label(data) 
        age      sex 
      "Age in Years" "Sex of the participant" 

lapply áp dụng một chức năng để mỗi phần tử của một danh sách hay vector. Trong trường hợp này, hàm được áp dụng cho mỗi giá trị của names(var.labels). Đọc qua một vài hướng dẫn là một cách hay để có được ý tưởng chung, nhưng bạn sẽ thực sự bị treo nếu bạn bắt đầu sử dụng lapply trong các tình huống khác nhau và xem cách hoạt động của nó.

+0

@ eipi10: Cảm ơn bạn rất nhiều! Nó hoạt động! Đây chính xác là những gì tôi cần. Tôi gặp vấn đề khi hiểu về lập chỉ mục khi làm việc với họ của các hàm 'apply'. Có hướng dẫn nào tôi có thể đọc được hay đó là vấn đề kinh nghiệm? – panman

+0

Để biết các hướng dẫn ngắn gọn về 'lapply', [this] (http://rollingyours.wordpress.com/category/r-programming-apply-lapply-tapply/) và [this] (https://nsaunders.wordpress.com/2010/08/20/a-brief-introduction-to-apply-in-r /) có thể hữu ích. Tôi cũng đã thêm một số giải thích thêm cho câu trả lời của tôi. – eipi10

2

Nếu vectơ nhãn của bạn khớp với thứ tự cột dữ liệu của bạn.không phải là một vector được đặt tên (do đó không thể được sử dụng để đặt các cột dữ liệu.frame theo tên như cách tiếp cận lapply trong câu trả lời khác) , bạn có thể sử dụng vòng lặp for:

for(i in seq_along(data)){ 
    Hmisc::label(data[, i]) <- var.labels[i] 
} 

label(data) 
#>      age      sex 
#>   "Age in Years" "Sex of the participant" 
3

Tôi khuyên bạn nên sử dụng chức năng Hmisc::upData().

Dưới đây là một ví dụ reprex:


set.seed(22) 
data <- data.frame(age = floor(rnorm(6,25,10)), 
        sex = gl(2,1,6, labels = c("f","m"))) 
var.labels <- c(age = "Age in Years", 
       sex = "Sex of the participant") 
dplyr::as.tbl(data) # as tibble --------------------------------------------- 
#> # A tibble: 6 × 2 
#>  age sex 
#> <dbl> <fctr> 
#> 1 19  f 
#> 2 49  m 
#> 3 35  f 
#> 4 27  m 
#> 5 22  f 
#> 6 43  m 
data <- Hmisc::upData(data, labels = var.labels) # update data -------------- 
#> Input object size: 1328 bytes;  2 variables  6 observations 
#> New object size: 2096 bytes; 2 variables 6 observations 
Hmisc::label(data) # check new labels --------------------------------------- 
#>      age      sex 
#>   "Age in Years" "Sex of the participant" 
Hmisc::contents(data) # data dictionary ------------------------------------- 
#> 
#> Data frame:data 6 observations and 2 variables Maximum # NAs:0 
#> 
#> 
#>      Labels Levels Class Storage 
#> age   Age in Years  integer integer 
#> sex Sex of the participant  2   integer 
#> 
#> +--------+------+ 
#> |Variable|Levels| 
#> +--------+------+ 
#> | sex | f,m | 
#> +--------+------+ 
+0

'Hmisc :: upData (dữ liệu, nhãn =)' thật tuyệt vời! Tìm kiếm điều này trong nhiều giờ. –

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