【问题标题】:Recode range multiple columns in r在r中重新编码范围多列
【发布时间】:2016-05-09 19:30:00
【问题描述】:

我找不到这个特定问题的答案。我想将多个字符列重新编码为数字列。 (是一百列)但是:

  • 列的顺序并不总是相同(我重新编码 每月更新的数据)。
  • 列由我不想重新编码的列分隔。
  • 数据集并不总是包含相同的列。

所以,我认为我不能使用一系列列索引。但是,我希望重新编码的列以相同的列名前缀开头。我想将任何“是”重新编码为 1,将“否”重新编码为 0,并将空白重新编码为 NA。

我可以使用以下代码一次手动完成一列:

    #Recode columns one at a time

    library(car)
    #skip ID column
    #Skip Date column
    df$Q1<-as.numeric(as.character(recode(df$Q1,"NA=NA; 'No'=0; 'Yes'=1; ''=NA")))
    df$Q2<-as.numeric(as.character(recode(df$Q2,"NA=NA; 'No'=0; 'Yes'=1; ''=NA")))
    #skip Q2.Explanation column
    #do the above for a hundred more columns...

但我想同时重新编码一百个特定的列。这些列也由我不想重新编码的列分隔。

我的数据如下。不确定 dput 是什么:

    ID<-c(01,02,03,04,05)
    Q1<-c("Yes", NA,"", "No",NA)
    Q1.Explanation<-c (NA, NA,"","Respondent did not get the correct answer", NA)
    Q2<-c("No","Yes","Yes","", NA)
    Q2.Explanation <-c("The right answer was not proven", NA, NA, NA, NA)
    Q3<-c("", NA, "Yes", NA, NA)
    Mydata<-as.data.frame(cbind(ID,Q1,Q1.Explanation, Q2, Q2.Explanation,Q3))

【问题讨论】:

  • 您可以使用grepl() 函数结合prefix 找出您要重新编码的列,然后循环遍历这些列进行重新编码。如果您想要更具体的答案,请通过粘贴数据的 dput 来提供您的 data.frame 示例。
  • 对于您要重新编码的所有列,重新编码逻辑是否始终相同(换句话说:翻译是否始终使用相同的映射逻辑)?
  • 是的,重新编码的逻辑总是一样的。

标签: r multiple-columns flags recode


【解决方案1】:

如果您知道要更改的列始终具有相同的名称,只是表中的位置不同,那么您可以对列名使用正则表达式进行子集化,然后使用apply() 更改列中的值。

your_data[, grep("Q", colnames(your_data))] <- as.data.frame(apply(your_data[, grep("Q", colnames(your_data))], 
                               2, 
                               function(x) recode(x, "NA = NA; 'No' = 0; 'Yes' = 1; '' = NA")))

这应该重新编码以“Q”开头的所有列,无论它们在任何给定月份的位置如何。

【讨论】:

  • 感谢您的帮助!我是 R 新手。我是否应该替换代码中显示“函数(x)重新编码(x)”的部分?我在那部分遇到了错误。
  • 我认为您必须将“your_data”替换为您的 data.frame 变量的名称 使用子字符串调整列名部分(“Q”)过滤您的列名(其值应重新编码)
  • 如果您使用dput() 分享您的一些数据并分享错误,我也许可以提供帮助。否则,我只能删除您发布的内容。
  • 在我删除最后一个括号后,该代码重新编码了所有列。错误消失了。但是,数据集只保留了带有“Q”的列......现在已经消失的错误是:错误:意外')'在:“ 2,函数(x)重新编码(x,”NA = NA ; '否' = 0; '是' = 1; '' = NA"))))"
  • 谢谢,而且,我确实在我的问题中提到了数字...这是问题的第一部分...
【解决方案2】:

对于data.table 的粉丝,我有另一个解决方案,它还具有使用factors 而不是数字整数进行重新编码的优点,以便 数值的含义仍能正确显示(提高数据的可读性):

library(data.table)

ID<-c(01,02,03,04,05)
Q1<-c("Yes", NA,"", "No",NA)
Q1.Explanation<-c (NA, NA,"","Respondent did not get the correct answer", NA)
Q2<-c("No","Yes","Yes","", NA)
Q2.Explanation <-c("The right answer was not proven", NA, NA, NA, NA)
Q3<-c("", NA, "Yes", NA, NA)
Mydata<-as.data.frame(cbind(ID,Q1,Q1.Explanation, Q2, Q2.Explanation,Q3))

Mydata

# The solution starts here... ----------------------------------------------

setDT(Mydata)     # convert data.frame into data.table

# the regular expression selects all column names starting with a "Q" followed by digits until the end
affected.cols <- colnames(Mydata)[grep("^Q\\d+$", colnames(Mydata))]

# convert the columns to factors; trailing square brackets are only added to print the output
Mydata[, (affected.cols) := lapply(affected.cols, function(x) { .SD[, factor(get(x), c("No", "Yes")) ] })] []

str(Mydata)           # Columns are encoded as factors ("enumerated types") now, which is an integer internally that has a string label

# Proof: 1 = "No", 2 = "Yes"; the "excluded" parameter of "factor()" caused all other values (mainly empty strings) to be translated into NAs
as.numeric(Mydata$Q1)

结果:

> as.numeric(Mydata$Q1)
[1]  2 NA NA  1 NA


> Mydata
   ID  Q1                            Q1.Explanation  Q2                  Q2.Explanation  Q3
1:  1 Yes                                        NA  No The right answer was not proven  NA
2:  2  NA                                        NA Yes                              NA  NA
3:  3  NA                                           Yes                              NA Yes
4:  4  No Respondent did not get the correct answer  NA                              NA  NA
5:  5  NA                                        NA  NA                              NA  NA

正确转换为数值是由于幸运的情况,请求的数值以 1 开头,因此“否”的级别索引为 1,“是”的级别索引为 2。

【讨论】:

    猜你喜欢
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    • 2022-08-23
    • 1970-01-01
    • 2020-01-26
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    相关资源
    最近更新 更多