簡體   English   中英

使用列表/數據框/向量通過Hmisc將標簽分配給數據框的列名

[英]Using a list / dataframe / vector to assign labels to column names of a dataframe with Hmisc

我想使用數據框的Variables列:

  Variables Varcode  Country Ccode  2000  2001 
1 Power     P        France  FR     1213  1234
2 Happiness H        France  FR     1872  2345
3 Power     P        UK      UK     1726  6433
4 Happiness H        UK      UK     2234  9082

為另一個(重塑的)數據幀的列名(從變量P開始)分配標簽:

  Year      Country Ccode P(label=Power) H(label=Happiness)
1 2000      France  FR    1213           1872  
2 2001      France  FR    1234           2345
3 2000      UK      UK    1726           2234
4 2001      UK      UK    6433           9082

我想到以下幾點:

重塑之前

library(Hmisc)
LabelList <- as.data.frame(df1$Varcode)
LabelList <- as.character(LabelList) #(EDIT)

重塑

df2 %>% 
  select(-Variables) %>% 
  gather(Year, val,`2000`:`2001`) %>% 
  unite(Country_Ccode, Country, Ccode, sep = "_") %>% 
  spread(Varcode, val) %>% 
  separate(Country_Ccode, c("Country", "Ccode"), sep = "_")

重塑后(編輯:標簽函數僅允許向量1)

for(i in LabelList){
label(df2[,i]) <- LabelList[i]

但是然后我得到以下錯誤:

Error in `[.data.frame`(List, i) : undefined columns selected
Error : Unsupported index type: factor

在as.character(LabelList)之后,錯誤變為:

Error : Column `c(1, 2, 3, 4, 5, 6, .., )

有任何想法嗎?

這是一個棘手的問題。 因此,我將逐步展示我的嘗試。

1.重塑沒有label<-()

第一次嘗試時,我求助於我更熟悉的data.table

library(data.table)   # for melt() and dcast()
library(magrittr)     # for piping %>%
df1 %>% 
  setDT() %>%
  melt(measure.vars = patterns("^20"), variable.name = "Year") %>% 
  dcast(... ~ Varcode + Variables)
  Country Ccode Year H_Happiness P_Power 1: France FR 2000 1872 1213 2: France FR 2001 2345 1234 3: UK UK 2000 2234 1726 4: UK UK 2001 9082 6433 

現在,值vars的列標題包含VarcodeVariables 我之所以嘗試這樣做,是因為我不確定OP打算使用Hmisc::label()實現什么。

2.使用label<-()重塑

df2 <- df1 %>% 
  setDT() %>%
  melt(measure.vars = patterns("^20"), variable.name = "Year") %>% 
  dcast(Year + Country + Ccode ~ Varcode)
  Year Country Ccode HP 1: 2000 France FR 1872 1213 2: 2000 UK UK 2234 1726 3: 2001 France FR 2345 1234 4: 2001 UK UK 9082 6433 

現在,我們必須向HP列添加標簽。

# create list of labels
Lbl <- df1[, .(Variables, Varcode)] %>% unique()
Lbl
  Variables Varcode 1: Power P 2: Happiness H 
# set labels
for (i in seq_len(nrow(Lbl))) {
  Hmisc::label(df2[[Lbl$Varcode[i]]]) <- Lbl$Variables[i]
}
str(df2)
 Classes 'data.table' and 'data.frame': 4 obs. of 5 variables: $ Year : Factor w/ 2 levels "2000","2001": 1 1 2 2 $ Country: chr "France" "UK" "France" "UK" $ Ccode : chr "FR" "UK" "FR" "UK" $ H : 'labelled' int 1872 2234 2345 9082 ..- attr(*, "label")= chr "Happiness" $ P : 'labelled' int 1213 1726 1234 6433 ..- attr(*, "label")= chr "Power" - attr(*, ".internal.selfref")=<externalptr> - attr(*, "sorted")= chr "Year" "Country" "Ccode" 

現在, HP列均已相應標記。

3.完成OP的方法

library(dplyr)
library(tidyr)
df2 <- df1 %>% 
  select(-Variables) %>% 
  gather(Year, val,`2000`:`2001`) %>% 
  spread(Varcode, val)
df2
  Country Ccode Year HP 1 France FR 2000 1872 1213 2 France FR 2001 2345 1234 3 UK UK 2000 2234 1726 4 UK UK 2001 9082 6433 

需要注意的是調用unite()separate()被跳過,因為我們不會需要他們重現預期的結果。

Lbl <- df1 %>% 
  distinct(Varcode, Variables)
for (i in seq_len(nrow(Lbl))) {
  Hmisc::label(df2[[Lbl$Varcode[i]]]) <- Lbl$Variables[i]
}
str(df2)
 'data.frame': 4 obs. of 5 variables: $ Country: chr "France" "France" "UK" "UK" $ Ccode : chr "FR" "FR" "UK" "UK" $ Year : chr "2000" "2001" "2000" "2001" $ H : 'labelled' int 1872 2345 2234 9082 ..- attr(*, "label")= chr "Happiness" $ P : 'labelled' int 1213 1234 1726 6433 ..- attr(*, "label")= chr "Power" 

數據

df1 <- data.table::fread(
"i  Variables Varcode  Country Ccode  2000  2001 
1 Power     P        France  FR     1213  1234
2 Happiness H        France  FR     1872  2345
3 Power     P        UK      UK     1726  6433
4 Happiness H        UK      UK     2234  9082
", drop = 1L, data.table = FALSE)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM