首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R中,如何使用第二个元数据文件对特定的data.table列进行分解和添加标签值?

在R中,如何使用第二个元数据文件对特定的data.table列进行分解和添加标签值?
EN

Stack Overflow用户
提问于 2020-06-19 01:10:34
回答 1查看 326关注 0票数 0

这是一个从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描述了变量的分析用途,描述了如何处理丢失的数据变量标签,描述了从一个从一个到有多少个标签开始的因素级别的标签。

正确的!下面是工作的代码:

代码语言:javascript
复制
```#Libraries

图书馆(费用)

图书馆(data.table)

库(Magrittr)`

代码语言:javascript
复制
```javascript

readcsvdata <- function(dfile)

{

测试-工作

打印(“OK让我们读一些逗号分隔的值”)

rdata <- fread(file = dfile,sep = ",“,引号=”\“,header = TRUE,stringsAsFactors = FALSE,

na.strings = getOption("datatable.na.strings",“”)

返回(Rdata)

}

代码语言:javascript
复制
```javascript

rawdatafilename <- "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)

代码语言:javascript
复制
(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标签

{

代码语言:javascript
复制
expss::var_lab(tdt[[each_name]]) <- qlabels[[each_name]]

}

代码语言:javascript
复制
OK this is where I fall down. Failure from here

```javascript

As.vector(公共名称)#创建列名向量(供以后使用)

用于(在工厂内)

{

打印( is.na(mdt4,..col)) #打印第一行值标签(作为测试)

如果(is.na(mdt4,..col))因子库<

如果不是一个因素列,请将其从因子列表中删除,不要尝试对其进行因子排序。

否则{#如果它是向量因式分解

代码语言:javascript
复制
print(paste("working on",col))  # I have had a lot of problem with unrecognised ..col variables
代码语言:javascript
复制
tlabels <- as.vector(na.omit(mdt[4:18, ..col]))  # get list of labels from the data column}
代码语言:javascript
复制
validrange <- seq(1,lengths(tlabels),1)            # range of valid values is 1 to the length of labels list
代码语言:javascript
复制
print(as.character(tlabels)) # for testing
代码语言:javascript
复制
print(validrange) # for testing
代码语言:javascript
复制
tdt[[col]] <- factor(tdt[[col]], levels = validrange, ordered = is.ordered(validrange), labels = as.character(tlabels))
代码语言:javascript
复制
# expss::val_lab(tdt[, ..col]) <- tlabels
代码语言:javascript
复制
tlabels = c()  # flush loop variable
代码语言:javascript
复制
validrange = c() # flush loop variable

}

}

代码语言:javascript
复制
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标签)

代码语言:javascript
复制
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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])。示例:

代码语言:javascript
复制
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"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62461766

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档