【问题标题】:How to simplify converting several column attributes and recoding multiple columns?如何简化转换多个列属性和重新编码多个列?
【发布时间】:2020-09-12 13:39:59
【问题描述】:

我有几行代码正在研究如何简化。我这样做的尝试导致了错误。下面是一小段代码:

SS_data$Cope1 <- as.numeric(SS_data$Cope1)
SS_data$Cope2 <- as.numeric(SS_data$Cope2)
SS_data$Cope3 <- as.numeric(SS_data$Cope3)
SS_data$Cope4 <- as.numeric(SS_data$Cope4)
SS_data$Cope5 <- as.numeric(SS_data$Cope5)
SS_data$Cope6 <- as.numeric(SS_data$Cope6)
SS_data$Cope7 <- as.numeric(SS_data$Cope7)
SS_data$Cope8 <- as.numeric(SS_data$Cope8)
SS_data$Cope9 <- as.numeric(SS_data$Cope9)
SS_data$Cope10 <- as.numeric(SS_data$Cope10)
SS_data$Cope11 <- as.numeric(SS_data$Cope11)
SS_data$Cope12 <- as.numeric(SS_data$Cope12)
SS_data$Cope13 <- as.numeric(SS_data$Cope13)
SS_data$Cope14 <- as.numeric(SS_data$Cope14)
SS_data$Cope15 <- as.numeric(SS_data$Cope15)
SS_data$Cope16 <- as.numeric(SS_data$Cope16)
SS_data$Cope17 <- as.numeric(SS_data$Cope17)
SS_data$Cope18 <- as.numeric(SS_data$Cope18)
SS_data$Cope19 <- as.numeric(SS_data$Cope19)
SS_data$Cope20 <- as.numeric(SS_data$Cope20)

我也在尝试简化下面的代码。我最终为每个变量重新编码,我想知道是否也有办法简化它。

WHOQOL16[WHOQOL16 == "Very dissatisfied"] <- 1
WHOQOL16[WHOQOL16 == "Dissatisfied"] <- 2
WHOQOL16[WHOQOL16 == "Neither satisfied nor dissatisfied"] <- 3
WHOQOL16[WHOQOL16 == "Satisfied"] <- 4
WHOQOL16[WHOQOL16 == "Very satisfied"] <- 5
              
WHOQOL17[WHOQOL17 == "Very dissatisfied"] <- 1
WHOQOL17[WHOQOL17 == "Dissatisfied"] <- 2
WHOQOL17[WHOQOL17 == "Neither satisfied nor dissatisfied"] <- 3
WHOQOL17[WHOQOL17 == "Satisfied"] <- 4
WHOQOL17[WHOQOL17 == "Very satisfied"] <- 5
              
WHOQOL18[WHOQOL18 == "Very dissatisfied"] <- 1
WHOQOL18[WHOQOL18 == "Dissatisfied"] <- 2
WHOQOL18[WHOQOL18 == "Neither satisfied nor dissatisfied"] <- 3
WHOQOL18[WHOQOL18 == "Satisfied"] <- 4
WHOQOL18[WHOQOL18 == "Very satisfied"] <- 5
              
WHOQOL19[WHOQOL19 == "Very dissatisfied"] <- 1
WHOQOL19[WHOQOL19 == "Dissatisfied"] <- 2
WHOQOL19[WHOQOL19 == "Neither satisfied nor dissatisfied"] <- 3
WHOQOL19[WHOQOL19 == "Satisfied"] <- 4
WHOQOL19[WHOQOL19 == "Very satisfied"] <- 5

【问题讨论】:

  • 欢迎来到 Stack Overflow。您能否编辑您的帖子以包含您的数据。以下代码将生成一个包含 10 条随机记录的代码 sn-p,您可以将其粘贴到原始帖子中:dput(dplyr::sample_n(YourDatasetsNameGoesHere, 10))。要使用我的代码,您可能需要安装 dplyr: install.packages("dplyr")
  • dplyr 中,您可以使用SS_data %&gt;% mutate(across(starts_with('Cope'), as.numeric)) 将所有以'Cope' 开头的列转换为数字。对于第二部分,WHOQOL16WHOQOL17 是您全球环境中的独立向量?
  • 谢谢。至于WHOQOL16、WHOQOL17,不一定。这些是单独的列。
  • 我试过 SS_data %>% mutate(across(starts_with('Cope'), as.numeric)) ,不幸的是,它仍然是字符。我已经安装并从库中加载了 dplyr。它也没有给出任何错误,所以我不太确定如何解决它。代码会运行,但是当我检查结构时,它仍然是字符。

标签: r simplify


【解决方案1】:

dplyr 中,您可以使用across 函数将相同的函数应用于多个列。

我们将以"Cope" 开头的列更改为数字并重新编码以"WHOQOL" 开头的列。

library(dplyr)

SS_data_new <- SS_data %>% 
                    mutate(across(starts_with('Cope'), as.numeric), 
                           across(starts_with('WHOQOL'), 
                           ~recode(., "Very dissatisfied" = 1, 
                                       "Dissatisfied" = 2, 
                                       "Neither satisfied nor dissatisfied" = 3, 
                                       "Satisfied" = 4, 
                                       "Very satisfied" = 5)))
SS_data_new
#  Cope1 Cope2 WHOQOL
#1     1     4      1
#2     2     5      1
#3     3     6      4
str(SS_data_new)
#data.frame':   3 obs. of  3 variables:
# $ Cope1 : num  1 2 3
# $ Cope2 : num  4 5 6
# $ WHOQOL: num  1 1 4

数据

SS_data <- data.frame(Cope1 = c('1', '2', '3'), Cope2 = c('4', '5', '6'), 
           WHOQOL = c("Very dissatisfied", "Very dissatisfied", "Satisfied"))

【讨论】:

  • 我使用了你所展示的编码。代码运行了,但是当我检查结构时,属性仍然是字符而不是数字。 WHOQOL 列没有重新编码并且保持不变。有什么想法吗?
  • 您需要将数据分配回一个新的或相同的变量。我已将其分配回SS_data_new,因此请检查SS_data_new 的结构与str(SS_data_new)
  • 谢谢。我最初确实这样做了,但它仍然显示为角色。 (代码看起来很简单,不太清楚为什么它没有按预期工作。)
  • 您的真实数据中的列名是否与此处显示的相同?
  • 是的,我愿意。列名相同。
【解决方案2】:

在 SO 上发布到 标记的问题应该包括可重现的数据,但我已经这样做了 这次你在最后的注释中。

以下仅使用基本 R。

首先在DF2 中复制DF,以防您想从头开始再次运行代码,因为代码将覆盖DF2

接下来将第 1 列和第 2 列转换为数字,并将第 3 列和第 4 列中的 X、Y 和 Z 转换为 1、2 和 3。如果第 1 列或第 2 列中出现非数字条目或不是 X、Y 或Z 出现在第 3 列或第 4 列中,然后 NA 将分配给这些条目。 (对于第二行代码,dplyr 包中有一个 recode 函数,而 car 包中有一个具有相同用途的不同 recode 函数。)

此示例中的列号很明显,但如果它们不在您的数据中,请使用 grep("Cope", names(DF)) 之类的表达式来获取它们。

DF2 <- DF
DF2[1:2] <- lapply(DF2[1:2], as.numeric)
DF2[3:4] <- lapply(DF2[3:4], match, c("X", "Y", "Z"))

给出以下警告只是为了让您知道它遇到了一个无法转换为数字的值,因此它将其转换为 NA。

> DF2
Warning message:
In lapply(DF[1:2], as.numeric) : NAs introduced by coercion
   A  B  C  D
1  1 11  1  1
2 NA 12  2 NA
3  3 13 NA  3

注意

DF <- data.frame(A = c("1", "x", "3"), B = c("11", "12", "13"),
  C = c("X", "Y", "a"), D = c("X", NA, "Z"))

【讨论】:

    猜你喜欢
    • 2018-05-11
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 2012-03-29
    • 2020-11-01
    • 1970-01-01
    相关资源
    最近更新 更多