这是一个从SPSS转换到R的项目的一部分,同时也有很好的工具将SPSS文件导入R (expss),这个问题的一部分是当数据来自CSV源时,试图获得SPSS风格标记的好处。这有助于弥合SPSS之间的培训差距,为data.tables提供一种通用格式,而不考虑文件格式的来源。
虽然CSV在存储数据方面做了合理的工作,但是提供有意义的数据是没有希望的。这不可避免地意味着变量和要素水平和标签必须来自其他地方。在大多数简短的示例中(例如,在文档中),简单地对元数据进行硬编码是切实可行的。但是对于较大的项目来说,将这些元数据存储在第二个csv文件中更有意义。
示例数据文件
ID,varone,vartwo,var-3,var-4,var5,var-6,var7,vareight,varnine,1,1,34,1,1 ,1,1 ,1,1,4,2 ,1,1 ,1,1,1,3,3,3,3,1,5,5,1,1,1,3,14,3,3,3,1,5,3,3,4,2,32,1,1,1,3,3,3,3,3,6,6,0,1,1,1,12,1,7,26,0,1 ,1,2,11,1,8,3,1,1,1,1,15,1,9,34,1,1,1,1,1,12 ,3,4 10,2,46,0,,,3,3,39 ,1,1,1 ,3,7,1,2 12,1,28,0,,,1,1,6,5,1 13,2,64,0,1,1 ,2,11,3 14,3,34,1,1,3,10,1 15,1,52,1,1,1,1,8,6,
示例元数据文件
行标签、ID、varone、var2、var3、var4、var5、var6、var7、vareight、varnine、varten var标签、问题一、问题二、问题三、问题四、问题五、问题六、问题七、问题八、问题九、问题十变体、唯一、态度、独特、过滤器、态度、态度、缺失、错误、错误、忽略、错误、未检查、错误、可忽略的、可、一、无、检查、x、一、A、支持一致、二、、是、y、2、B、中性vallable、、3、z、3、C,反对vallable、4、D,不知道vallable、5、E、vallable、6、F、vallable、、八、九、10、11、12、.,,,
因此,常见的元素是列名,它们是两个文件的关键。
元数据文件的第一列描述了数据文件的行的角色,因此varlabel为每一列提供变量标签,varrole描述了变量的分析用途,描述了如何处理丢失的数据变量标签,描述了从一个从一个到有多少个标签开始的因素级别的标签。
正确的!下面是工作的代码:
```#Libraries图书馆(费用)
图书馆(data.table)
库(Magrittr)`
```javascriptreadcsvdata <- function(dfile)
{
测试-工作
打印(“OK让我们读一些逗号分隔的值”)
rdata <- fread(file = dfile,sep = ",“,引号=”\“,header = TRUE,stringsAsFactors = FALSE,
na.strings = getOption("datatable.na.strings",“”)
返回(Rdata)
}
```javascriptrawdatafilename <- "testdata.csv“
RAW元数据<- "metadata.csv“
mdt <- readcsvdata(mdt元数据)
rdt <- readcsvdata(rawdatafilename)
名称(Rdt)名称(Rdt) == "ï..ID“<- "ID”#更正小数据错误
公共名称<-相交(名称(Mdt),名称(Rdt))#查找公共变量名,以便应用元数据
<-公共名称-(1)#删除ID
Q标签<- as.list(mdt1,commonnames,with = FALSE)
(Here I copy the rdt datatable simply so I can roll back to the original data without re-running the previous read chunks and tidying whenever I make changes that don't work out.
```javascript将var名称设置为列
for (公共名称中的each_name)#循环通过公共名称和q标签
{
expss::var_lab(tdt[[each_name]]) <- qlabels[[each_name]]}
OK this is where I fall down. Failure from here
```javascriptAs.vector(公共名称)#创建列名向量(供以后使用)
用于(在工厂内)
{
打印( is.na(mdt4,..col)) #打印第一行值标签(作为测试)
如果(is.na(mdt4,..col))因子库<
如果不是一个因素列,请将其从因子列表中删除,不要尝试对其进行因子排序。
否则{#如果它是向量因式分解
print(paste("working on",col)) # I have had a lot of problem with unrecognised ..col variablestlabels <- as.vector(na.omit(mdt[4:18, ..col])) # get list of labels from the data column}validrange <- seq(1,lengths(tlabels),1) # range of valid values is 1 to the length of labels listprint(as.character(tlabels)) # for testingprint(validrange) # for testingtdt[[col]] <- factor(tdt[[col]], levels = validrange, ordered = is.ordered(validrange), labels = as.character(tlabels))# expss::val_lab(tdt[, ..col]) <- tlabelstlabels = c() # flush loop variablevalidrange = c() # flush loop variable}
}
So the problem is revealed here when we check the data table.
`tdt`
the labels have been applied as whole vectors to each column entry except where there is only one value in the vector ("checked" for varfour and varfive)
**tdt**
id (int) 1
varone (fctr) c("One", "Two", "Three") 1 _(should be "One" 1)_
vartwo (S3: labelled) 34
varthree (fctr) c("No", "Yes") 1 _(should be "No" 1)_
varfour (fctr) NA
varfive (fctr) Checked
**And a mystery**
this code works just fine on a single columns when I don't use a for loop variable
```javascript使用列名进行测试
标签<- c(“一”、“二”、“三”)
有效期<- c(1,2,3)
因子(tdt,varone,level= validrange,ordered=is.ordered(有效性范围),标签=t标签)
发布于 2020-06-20 23:01:17
看起来问题就在tlabels <- as.vector(na.omit(mdt[4:18, ..col]))这条线上。它不会像你所期望的那样产生向量。与通常的data.frame相反,当您在索引中提供单列时,data.table不会降维。as.vector对data.framework/data.table什么也不做。所以tlabels仍然是data.table。这一行需要重写为tlabels <- na.omit(mdt[[col]][4:18])。示例:
library(data.table)
mdt = as.data.table(mtcars)
col = "am"
tlabels <- as.vector(na.omit(mdt[3:6, ..col])) # ! tlabels is data.table
str(tlabels)
# Classes ‘data.table’ and 'data.frame': 4 obs. of 1 variable:
# $ am: num 1 0 0 0
# - attr(*, ".internal.selfref")=<externalptr>
as.character(tlabels) # character vector of length 1
# [1] "c(1, 0, 0, 0)"
tlabels <- na.omit(mdt[[col]][3:6]) # vector
str(tlabels)
# num [1:4] 1 0 0 0
as.character(tlabels) # character vector of length 4
# [1] "1" "0" "0" "0"https://stackoverflow.com/questions/62461766
复制相似问题