首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >列表中变量的重新编码

列表中变量的重新编码
EN

Stack Overflow用户
提问于 2015-01-17 14:34:21
回答 1查看 1.1K关注 0票数 2

我想我写作的精神是“没有问题太容易”,我只是一个普通的用户社会科学家第一次接近R和有无休止的夜晚面对它.求你宽恕我!

我正在使用来自20个国家的比较数据集(大约20,000次观察,在各国之间相当平衡)。我必须执行一组计算强度相当高的MCMC模拟,因此我决定将df分解为包含20个(特定国家) df的列表,然后继续进行lapply()。(我读到,避免R上的for循环更有效,对吗?)

我最直接的问题是,我无法对列表中包含的各种df中的元素进行预处理。特别是,我必须重新编码一组15个变量,这些是从0到10的整数,其中包括77 88, 89, 99, 999缺失情况下的典型值。我想将这些值重新编码为NA,然后进行一些附加的转换:Centeron0,使用两个不同的变量集TTT定义两个df对象TTT,以便稍后在模拟中使用。这一任务必须在组成“主”列表"ees2009split“的20个特定国家的列表元素中重复。

代码语言:javascript
复制
ees2009split <- vector("list", 20)
ees2009split <- split(ees2009, ees2009$t102) # t102 is the country identifier
names(ees2009split) <- country.names[1:2]    # rename list objects with country names

下面是我的列表(抱歉,我无法提供一个可重复的例子):

代码语言:javascript
复制
    > str(ees2009split)
List of 20
 $         Austria :'data.frame':   1000 obs. of  17 variables:
  ..$ t102   : int [1:1000] 1040 1040 1040 1040 1040 1040 1040 1040 1040 1040 ...
  ..$ q46    : int [1:1000] 77 2 5 5 5 77 5 5 5 77 ...
  ..$ q47_p1 : int [1:1000] 77 3 5 4 77 77 5 1 89 77 ...
  ..$ q47_p2 : int [1:1000] 77 8 7 6 77 77 5 6 5 77 ...
  ..$ q47_p3 : int [1:1000] 77 10 10 9 77 77 5 7 7 77 ...
  ..$ q47_p4 : int [1:1000] 77 10 9 8 77 77 5 7 4 77 ...
  ..$ q47_p5 : int [1:1000] 77 2 5 3 77 77 5 1 3 77 ...
  ..$ q47_p6 : int [1:1000] 77 4 89 5 77 77 89 2 89 77 ...
  ..$ q47_p7 : int [1:1000] 77 3 89 6 77 77 89 3 5 77 ...
  ..$ q47_p8 : int [1:1000] 77 1 0 0 77 77 5 0 89 77 ...
  ..$ q47_p9 : int [1:1000] 99 99 99 99 99 99 99 99 99 99 ...
  ..$ q47_p10: int [1:1000] 99 99 99 99 99 99 99 99 99 99 ...
  ..$ q47_p11: int [1:1000] 99 99 99 99 99 99 99 99 99 99 ...
  ..$ q47_p12: int [1:1000] 99 99 99 99 99 99 99 99 99 99 ...
  ..$ q47_p13: int [1:1000] 99 99 99 99 99 99 99 99 99 99 ...
  ..$ q47_p14: int [1:1000] 99 99 99 99 99 99 99 99 99 99 ...
  ..$ q47_p15: int [1:1000] 99 99 99 99 99 99 99 99 99 99 ...
 $         Belgium :'data.frame':   1002 obs. of  17 variables:
  ..$ t102   : int [1:1002] 1056 1056 1056 1056 1056 1056 1056 1056 1056 1056 ...
  ..$ q46    : int [1:1002] 5 0 77 88 77 88 5 2 77 5 ...
  ..$ q47_p1 : int [1:1002] 88 5 77 77 6 77 5 77 5 77 ...
  ..$ q47_p2 : int [1:1002] 88 10 77 77 8 77 89 77 10 77 ...
  ..$ q47_p3 : int [1:1002] 88 7 77 77 5 77 3 77 0 77 ...
  ..$ q47_p4 : int [1:1002] 88 10 77 77 10 77 10 77 10 77 ...
  ..$ q47_p5 : int [1:1002] 88 0 77 77 4 77 4 77 5 77 ...
  ..$ q47_p6 : int [1:1002] 99 99 77 99 99 77 99 77 99 99 ...
  ..$ q47_p7 : int [1:1002] 99 99 77 99 99 77 99 77 99 99 ...
  ..$ q47_p8 : int [1:1002] 99 99 88 99 99 77 99 77 99 99 ...
  ..$ q47_p9 : int [1:1002] 99 99 77 99 99 77 99 77 99 99 ...
  ..$ q47_p10: int [1:1002] 99 99 99 99 99 99 99 99 99 99 ...
  ..$ q47_p11: int [1:1002] 99 99 99 99 99 99 99 99 99 99 ...
  ..$ q47_p12: int [1:1002] 99 99 99 99 99 99 99 99 99 99 ...
  ..$ q47_p13: int [1:1002] 99 99 99 99 99 99 99 99 99 99 ...
  ..$ q47_p14: int [1:1002] 99 99 99 99 99 99 99 99 99 99 ...
  ..$ q47_p15: int [1:1002] 99 99 99 99 99 99 99 99 99 99 ...

等等。直到20国。

我定义了两个用lapply()调用的函数,rename()函数和recode()函数。

代码语言:javascript
复制
rename <- function(x) {
    # renaming
    names(x) <- gsub("q46", "lr.self", names(x))
    names(x) <- gsub("q47_p", "lr.p", names(x))
    return(x)
}       

到目前为止还不错:

代码语言:javascript
复制
> processed.dat <- lapply(ees2009split, renaming)
> str(processed.dat)
List of 20
 $         Austria :'data.frame':   1000 obs. of  17 variables:
  ..$ t102   : int [1:1000] 1040 1040 1040 1040 1040 1040 1040 1040 1040 1040 ...
  ..$ lr.self: int [1:1000] 77 2 5 5 5 77 5 5 5 77 ...
  ..$ lr.p1  : int [1:1000] 77 3 5 4 77 77 5 1 89 77 ...
# I omit the rest...

使用重新编码功能,我反而感到很困难:

代码语言:javascript
复制
recoding <- function(x){
        # recode missing values
        x$lr.self[lr.self %in% c(77, 88, 89, 98, 99, 999)] <- NA
        x$lr.p1[lr.p1 %in% c(77, 88, 89, 98, 99, 999)] <- NA
        x$lr.p2[lr.p2 %in% c(77, 88, 89, 98, 99, 999)] <- NA
        x$lr.p3[lr.p3 %in% c(77, 88, 89, 98, 99, 999)] <- NA
        x$lr.p4[lr.p4 %in% c(77, 88, 89, 98, 99, 999)] <- NA
        x$lr.p5[lr.p5 %in% c(77, 88, 89, 98, 99, 999)] <- NA
        x$lr.p6[lr.p6 %in% c(77, 88, 89, 98, 99, 999)] <- NA
        x$lr.p7[lr.p7 %in% c(77, 88, 89, 98, 99, 999)] <- NA
        x$lr.p8[lr.p8 %in% c(77, 88, 89, 98, 99, 999)] <- NA
        x$lr.p9[lr.p9 %in% c(77, 88, 89, 98, 99, 999)] <- NA
        x$lr.p10[lr.p10 %in% c(77, 88, 89, 98, 99, 999)] <- NA
        x$lr.p11[lr.p11 %in% c(77, 88, 89, 98, 99, 999)] <- NA
        x$lr.p12[lr.p12 %in% c(77, 88, 89, 98, 99, 999)] <- NA
        x$lr.p13[lr.p13 %in% c(77, 88, 89, 98, 99, 999)] <- NA
        x$lr.p14[lr.p14 %in% c(77, 88, 89, 98, 99, 999)] <- NA
        x$lr.p15[lr.p15 %in% c(77, 88, 89, 98, 99, 999)] <- NA

        x$T <- cbind(lr.self, lr.p1, lr.p2, lr.p3, lr.p4, lr.p5, lr.p6, lr.p7, lr.p8, lr.p9, lr.p10, lr.p11, lr.p12, lr.p13, lr.p14, lr.p15) 
        T <- T - 5      # centering on 0

        lrself.resc <- T[,1]    # rescaled lr.self
        TT <- T[,-1]            # whole matrix rescaled

        N <- nrow(TT)
        q <- ncol(TT)
        z <- TT
        x$dat.list <- list(lr.self=lr.self, lr.p1=lr.p1, lr.p2=lr.p2, lr.p3=lr.p3, lr.p4=lr.p4, lr.p5=lr.p5, lr.p6=lr.p6, lr.p7=lr.p7, lr.p8=lr.p8, lr.p9=lr.p9, lr.p10=lr.p10, lr.p11=lr.p11, lr.p12=lr.p12, lr.p13=lr.p13, lr.p14=lr.p14, lr.p15=lr.p15, T=T, TT=TT, lrself.resc, N=N, q=q, z=z)
        return(x$dat.list)
}

这是输出:

代码语言:javascript
复制
> processed.dat <- lapply(ees2009split, recoding)
Error in match(x, table, nomatch = 0L) : object 'lr.self' not found
Called from: FUN(X[[1L]], ...)
Browse[1]> 

1)如何在包含在带有lapply()的列表中的数据框架中重新编码变量?更广泛地说,我如何在国家内插入对象df在函数中? 2)从更一般的立场来看,这种做法是正确的?拆分,定义特定于任务的函数,用lapply()调用它们,最后重新组合?

谢谢您的任何建议或评论。安德里亚

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-17 15:52:43

这应该适用于数据清理。我使用库gdata,您可能需要用以下命令安装它:install.packages('gdata')。在其中,您将发现一个非常有用的函数,即unknownToNA()。参见下面的示例。就像我说的,我更喜欢在把数据分开之前先做清理工作。我还冒昧地使用了EES 2009数据集

代码语言:javascript
复制
library(foreign)
library(gdata)
#setwd("/Data/sample")
#list.files()
mydata <- read.dta("ZA5055_v1-1-0.dta")
keepvars <- grep("^q46|^q47|^t102",names(mydata), value=T)
mydata2 <- subset(mydata, select=keepvars)
rm(mydata)
str(mydata2)
head(mydata2)
naval <- c(77, 88, 89, 99, 999)
mydata3 <- unknownToNA(mydata2, unknown=list(.default=naval))
head(mydata3)

#      t102 q46 q47_p1 q47_p2 q47_p3 q47_p4 q47_p5 q47_p6 q47_p7 q47_p8 q47_p9 q47_p10 q47_p11 q47_p12 q47_p13
# 1 Austria  NA     NA     NA     NA     NA     NA     NA     NA     NA     NA      NA      NA      NA      NA
# 2 Austria   2      3      8     10     10      2      4      3      1     NA      NA      NA      NA      NA
# 3 Austria   5      5      7     10      9      5     NA     NA      0     NA      NA      NA      NA      NA
# 4 Austria   5      4      6      9      8      3      5      6      0     NA      NA      NA      NA      NA
# 5 Austria   5     NA     NA     NA     NA     NA     NA     NA     NA     NA      NA      NA      NA      NA
# 6 Austria  NA     NA     NA     NA     NA     NA     NA     NA     NA     NA      NA      NA      NA      NA
# q47_p14 q47_p15
# 1      NA      NA
# 2      NA      NA
# 3      NA      NA
# 4      NA      NA
# 5      NA      NA
# 6      NA      NA

如果出于某种原因,你宁愿先分手,那就这样吧:

代码语言:javascript
复制
    library(gdata)
    ees2009split <- split(mydata2, mydata2$t102)
    ees2009split <- unknownToNA(ees2009split, unknown=list(.default=list(naval)))
    head(ees2009split[[1]])


     t102 q46 q47_p1 q47_p2 q47_p3 q47_p4 q47_p5 q47_p6 q47_p7 q47_p8 q47_p9 q47_p10 q47_p11 q47_p12 q47_p13
1 Austria  NA     NA     NA     NA     NA     NA     NA     NA     NA     NA      NA      NA      NA      NA
2 Austria   2      3      8     10     10      2      4      3      1     NA      NA      NA      NA      NA
3 Austria   5      5      7     10      9      5     NA     NA      0     NA      NA      NA      NA      NA
4 Austria   5      4      6      9      8      3      5      6      0     NA      NA      NA      NA      NA
5 Austria   5     NA     NA     NA     NA     NA     NA     NA     NA     NA      NA      NA      NA      NA
6 Austria  NA     NA     NA     NA     NA     NA     NA     NA     NA     NA      NA      NA      NA      NA
  q47_p14 q47_p15
1      NA      NA
2      NA      NA
3      NA      NA
4      NA      NA
5      NA      NA
6      NA      NA

恐怕我不太了解你的下一步行动,无法进一步帮助你。但是通常情况下,对于缩放,我使用scale函数,它以0为中心并进行规范化:

代码语言:javascript
复制
head(scale(mydata3[,-1]))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28000517

复制
相关文章

相似问题

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