英文:
How to replace values by labels in data.frames from spss files?
问题
我必须读取一个.sav文件
我使用了haven
包
library(haven)
dataset <- read_sav("datafile.sav")
在控制台中,我可以看到标签:
dput(head(voyages$portdep))
structure(c(50422, 50299, 50299, 50299, NA, NA), label = "Port of departure", labels = c(Alicante = 10101,
Barcelona = 10102, Bilbao = 10103, Cadiz = 10104, Figuera = 10105,
Gibraltar = 10106, `La Coruña` = 10107, Santander = 10110, Seville = 10111,
`San Lucar` = 10112, Vigo = 10113, `Spain, port unspecified` = 10199,
Lagos = 10202, Lisbon = 10203, Oporto = 10204, `Ilho do Fayal` = 10205,
Setubal = 10206, `Portugal, port unspecified` = 10299, `Great Britain, port unspecified` = 10399,
Barmouth = 10401, Bideford = 10402, Birkenhead = 10403, Bristol = 10404,
Brixham = 10405, Broadstairs = 10406, Cawsand = 10407, Chepstow = 10408,
Chester = 10409, Colchester = 10410, Cowes = 10411, Dartmouth = 10412,
Deptford = 10413, Dover = 10414, Exeter = 10415, Folkstone = 10416,
Frodsham = 10417, Gainsborough = 10418, Greenwich = 10419, Guernsey = 10420,
Harwich = 10421, Hull = 10422, Ilfracombe = 10423, Ipswich = 10424,
`Isle of Man` = 10425, `Isle of Wight` = 10426, Jersey = 10427,
Kendal = 10428, `King's Lynn` = 10429, Lancaster = 10430, Lindale = 10431,
Liverpool = 10432, London = 10433, Lyme = 10434, Maryport = 10436,
`Milford Haven` = 10437, `New Shoreham` = 10438, `Newcastle upon Tyne` = 10439,
Newnham = 10440, `North Shields` = 10441, Norwich = 10443, Padstowe = 10444,
Parkgate = 10445, `Piel of Foulney` = 10446, Plymouth = 10447,
Poole = 10448, Portsery = 10449, Portsmouth = 10450, Poulton = 10451,
Preston = 10452, Ramsgate = 10453, Ravenglass = 10454, `River Thames` = 10455,
Rochester = 10456, Rotherhithe = 10457, Rye = 10458, Scarborough = 10459,
Sheerness = 10460, Shields = 10461, Shoreham = 10462, Sidmouth = 10463,
Southampton = 10464, Stockton = 10466, Stockwithe = 10467, Sunderland = 10468,
Teignmouth = 10469, Topsham = 10470, Torbay = 10471, Wales = 10472,
)
在HTML表格中,我只有值:
如何在来自SPSS文件的数据框中用标签替换值以在HTML表格中显示?
使用sjlabelled
包,我可以获取任何列的标签:
library(sjlabelled)
get_labels(voyages$portdep)
1] "Alicante" "Barcelona" "Bilbao" "Cadiz"
[5] "Figuera" "Gibraltar" "La Coruña" "Santander"
[9] "Seville" "San Lucar" "Vigo" "Spain, port unspecified"
[13] "Lagos" "Lisbon" "Oporto" "Ilho do Fayal"
[17] "Setubal" "Portugal, port unspecified" "Great Britain, port unspecified" "Barmouth"
[21] "Bideford" "Birkenhead" "Bristol" "Brixham"
[25] "Broadstairs" "Cawsand" "Chepstow" "Chester"
[29] "Colchester" "Cowes" "Dartmouth" "Deptford"
[33] "Dover" "Exeter" "Folkstone" "Frodsham"
[37] "Gainsborough" "Greenwich" "Guernsey" "Harwich"
[41] "Hull" "Ilfracombe" "Ipswich" "Isle of Man"
[45] "Isle of Wight" "Jersey" "Kendal" "King's Lynn"
我尝试过:
对于单个列:
dataset2 <- dataset %>% mutate(portdep = get_labels(portdep))
错误:列
portdep
必须是长度为36002(行数)或一个,而不是847
对于整个数据框:
dataset2 <- dataset %>% mutate_all(funs(get_labels(.)))
在第一列上出现相同的错误:
列 xxx 必须是长度为36002(行数)或一个,而不是2
英文:
I have to read a sav file
I use the package haven
library(haven)
dataset<- read_sav("datafile.sav")
In the console I can see the labels :
dput(head(voyages$portdep))
structure(c(50422, 50299, 50299, 50299, NA, NA), label = "Port of departure", labels = c(Alicante = 10101,
Barcelona = 10102, Bilbao = 10103, Cadiz = 10104, Figuera = 10105,
Gibraltar = 10106, `La Coruña` = 10107, Santander = 10110, Seville = 10111,
`San Lucar` = 10112, Vigo = 10113, `Spain, port unspecified` = 10199,
Lagos = 10202, Lisbon = 10203, Oporto = 10204, `Ilho do Fayal` = 10205,
Setubal = 10206, `Portugal, port unspecified` = 10299, `Great Britain, port unspecified` = 10399,
Barmouth = 10401, Bideford = 10402, Birkenhead = 10403, Bristol = 10404,
Brixham = 10405, Broadstairs = 10406, Cawsand = 10407, Chepstow = 10408,
Chester = 10409, Colchester = 10410, Cowes = 10411, Dartmouth = 10412,
Deptford = 10413, Dover = 10414, Exeter = 10415, Folkstone = 10416,
Frodsham = 10417, Gainsborough = 10418, Greenwich = 10419, Guernsey = 10420,
Harwich = 10421, Hull = 10422, Ilfracombe = 10423, Ipswich = 10424,
`Isle of Man` = 10425, `Isle of Wight` = 10426, Jersey = 10427,
Kendal = 10428, `King's Lynn` = 10429, Lancaster = 10430, Lindale = 10431,
Liverpool = 10432, London = 10433, Lyme = 10434, Maryport = 10436,
`Milford Haven` = 10437, `New Shoreham` = 10438, `Newcastle upon Tyne` = 10439,
Newnham = 10440, `North Shields` = 10441, Norwich = 10443, Padstowe = 10444,
Parkgate = 10445, `Piel of Foulney` = 10446, Plymouth = 10447,
Poole = 10448, Portsery = 10449, Portsmouth = 10450, Poulton = 10451,
Preston = 10452, Ramsgate = 10453, Ravenglass = 10454, `River Thames` = 10455,
Rochester = 10456, Rotherhithe = 10457, Rye = 10458, Scarborough = 10459,
Sheerness = 10460, Shields = 10461, Shoreham = 10462, Sidmouth = 10463,
Southampton = 10464, Stockton = 10466, Stockwithe = 10467, Sunderland = 10468,
Teignmouth = 10469, Topsham = 10470, Torbay = 10471, Wales = 10472,
In html table, I have only the values :
How to replace values by labels in data.frames from spss files ?for displaying in html table ?
using sjlabelled package, I can get labels of any column :
library(sjlabelled)
get_labels(voyages$portdep)
1] "Alicante" "Barcelona" "Bilbao" "Cadiz"
[5] "Figuera" "Gibraltar" "La Coruña" "Santander"
[9] "Seville" "San Lucar" "Vigo" "Spain, port unspecified"
[13] "Lagos" "Lisbon" "Oporto" "Ilho do Fayal"
[17] "Setubal" "Portugal, port unspecified" "Great Britain, port unspecified" "Barmouth"
[21] "Bideford" "Birkenhead" "Bristol" "Brixham"
[25] "Broadstairs" "Cawsand" "Chepstow" "Chester"
[29] "Colchester" "Cowes" "Dartmouth" "Deptford"
[33] "Dover" "Exeter" "Folkstone" "Frodsham"
[37] "Gainsborough" "Greenwich" "Guernsey" "Harwich"
[41] "Hull" "Ilfracombe" "Ipswich" "Isle of Man"
[45] "Isle of Wight" "Jersey" "Kendal" "King's Lynn"
I tried :
On a single column :
dataset2 <- dataset %>% mutate(portdep = get_labels(portdep))
> Erreur : Column portdep
must be length 36002 (the number of rows) or
> one, not 847
On all the dataframe :
dataset2 <- dataset %>% mutate_all(funs(get_labels(.)))
With the same error on first column :
> Column xxx must be length 36002 (the number of rows) or one, not 2
答案1
得分: 5
我认为你可以使用 haven::as_factor
来获取你正在寻找的内容。
这个工作吗?
library(haven)
library(dplyr)
dataset %>%
mutate_all(as_factor) %>%
head() %>%
View()
英文:
I think you can get what you're looking for by using haven::as_factor
.
Does this work?
library(haven)
library(dplyr)
dataset %>%
mutate_all(as_factor) %>%
head() %>%
View()
答案2
得分: 2
不使用 haven
包,你可以尝试使用 foreign
。我使用了自己的数据 try.sav
,其中包括一个名为 gender
的变量:
library(haven)
df_haven<- read_sav("try.sav")
class(df_haven$gender)
#> [1] "haven_labelled"
table(df_haven$gender)
#>
#> 1 2
#> 1972 2417
df_haven$gender
#> <Labelled double>: Gender
#> [1] 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 1 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 2 2
#> [38] 2 2 2 1 2 2 1 2 2 2 2 2 2 2 2 1 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
#> [75] 2 2 1 1 2 2 1 2 1 2 1 1 2 1 2 1 1 2 2 2 2 2 1 1 2 2 1 2 1 2 2 2 1 1 2 2 1
#> ...
#> Labels:
#> value label
#> 1 male
#> 2 female
library(foreign)
df_foreign<- read.spss("try.sav", to.data.frame = TRUE)
#> re-encoding from UTF-8
class(df_foreign$gender)
#> [1] "factor"
table(df_foreign$gender)
#>
#> male female
#> 1972 2417
df_foreign$gender
#> [1] female female female male female female female female female female
#> [11] female female female male female female female female female male
#> [21] female female female female female female male male male male
#> [31] female female female female female female female female female female
#> [41] male female female male female female female female female female
#> [51] female female male female female female female male female female
#> [61] female female female female female female female female female female
#> [71] female female female female female female male male female female
#> [81] male female male female male male female male female male
#> [91] male female female female female female male male female female
#> ...
#> Levels: male female
2020-01-06 由 reprex package (v0.3.0) 创建
英文:
Instead of using haven
package, you could try foreign
. I used my own data try.sav
including a variable gender
:
library(haven)
df_haven<- read_sav("try.sav")
class(df_haven$gender)
#> [1] "haven_labelled"
table(df_haven$gender)
#>
#> 1 2
#> 1972 2417
df_haven$gender
#> <Labelled double>: Gender
#> [1] 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 1 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 2 2
#> [38] 2 2 2 1 2 2 1 2 2 2 2 2 2 2 2 1 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
#> [75] 2 2 1 1 2 2 1 2 1 2 1 1 2 1 2 1 1 2 2 2 2 2 1 1 2 2 1 2 1 2 2 2 1 1 2 2 1
#> ...
#> Labels:
#> value label
#> 1 male
#> 2 female
library(foreign)
df_foreign<- read.spss("try.sav", to.data.frame = TRUE)
#> re-encoding from UTF-8
class(df_foreign$gender)
#> [1] "factor"
table(df_foreign$gender)
#>
#> male female
#> 1972 2417
df_foreign$gender
#> [1] female female female male female female female female female female
#> [11] female female female male female female female female female male
#> [21] female female female female female female male male male male
#> [31] female female female female female female female female female female
#> [41] male female female male female female female female female female
#> [51] female female male female female female female male female female
#> [61] female female female female female female female female female female
#> [71] female female female female female female male male female female
#> [81] male female male female male male female male female male
#> [91] male female female female female female male male female female
....
#> Levels: male female
<sup>Created on 2020-01-06 by the reprex package (v0.3.0)</sup>
答案3
得分: 1
你也可以使用 haven 包中的 as_factor() 函数。
library(haven)
as_factor(df_foreign$gender)
英文:
You could also use as_factor() from haven package.
library(haven)
as_factor(df_foreign$gender)
That should work! Good luck!
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论