【问题标题】:How can I replace all instances of words with numbers in an R dataframe?如何用 R 数据框中的数字替换所有单词实例?
【发布时间】:2021-07-05 05:24:11
【问题描述】:

我正在处理一项调查的结果,为了对其进行统计分析,我需要将“非常同意”、“同意”、“既不同意也不反对”、“不同意”和“非常不同意”替换为编号分别为 5-1。在我的数据框中,每一列都是一个问题,每一行是一个受访者,所以我需要替换每个实例,而不仅仅是在一列中。

如果这重复了之前的问题,我深表歉意 - 我已经尝试了几个答案,但都没有成功,我希望在明天早上之前完成这个会议!

我这样做了:

df[df=="Strongly Agree"]<-"5"

但这用 NA 替换了所有“非常同意”。然后我尝试了这个:

lookuptable <- data.frame(answers = c("Strongly Agree", "Agree", "Neither agree or disagree", "Disagree", "Strongly Disagree"))

lookuptable$values <- c(5, 4, 3, 2, 1)

df[] <- lookuptable$values[match(df, lookuptable$answers)]

但这用 NA 替换了所有条目!

我将非常感谢任何建议,我知道我可能过于复杂,因为我对 R 还很陌生!谢谢。

【问题讨论】:

  • 什么是df。它是具有多列的 data.frame 吗?请注意,match 可以将矩阵或向量作为输入,而不是 data.frame。可能,您需要更改match(as.matrix(df)match(unlist(df), lookuptable$answers)
  • @akrun 感谢您的快速回复 - 我试过 df[] &lt;- lookuptable$values[match(unlist(df), lookuptable$answers)] 但它们仍然是 NA,即使是不包含任何搜索词的时间戳列
  • 根据我在解决方案中提供的示例,它按预期工作。我假设“df”中的所有列都具有查找表中“答案”列中指定的值
  • 您是否有可能拥有factor 列,或者除了要比较的列之外还有其他列
  • 哦,当然!谢谢,成功了!

标签: r


【解决方案1】:

在这里,我们只需将match(df 更改为match(unlist(df) 或根据?match 转换为matrix,第一个参数'x' 将是一个向量

x - 向量或NULL:要匹配的值。支持长向量。

unlisting 返回一个向量或转换为matrix 可以是一个带有dim 属性的向量

df[] <- lookuptable$values[match(as.matrix(df), lookuptable$answers)]

-输出

 df
   V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
1   3  3  2  4  4  5  1  3  2   5
2   4  1  1  4  5  5  5  5  1   5
3   3  4  4  3  2  1  4  3  3   2
4   1  5  5  3  1  3  2  1  4   1
5   4  1  5  1  5  3  2  5  3   3
6   4  2  5  4  5  1  5  3  4   1
7   5  2  5  3  3  3  2  3  4   4
8   2  4  3  3  1  2  1  3  2   4
9   5  3  2  1  3  2  1  5  1   3
10  5  4  3  3  3  3  4  2  3   1
11  1  3  1  5  2  5  4  5  5   2
12  1  1  1  4  2  5  1  1  3   4
13  5  5  4  4  4  5  5  1  5   4
14  1  3  4  5  4  2  2  1  3   1
15  1  5  2  2  3  5  2  2  1   5
16  2  5  2  1  5  4  4  1  4   3
17  1  4  4  3  1  5  4  1  3   2
18  4  2  3  2  1  5  2  1  5   2
19  5  3  3  4  2  4  3  3  2   4
20  2  3  4  4  4  1  5  3  5   3

-比较输入数据和查找表

> head(df)
                         V1                        V2                V3                        V4                V5                        V6
1 Neither agree or disagree Neither agree or disagree          Disagree                     Agree             Agree            Strongly Agree
2                     Agree         Strongly Disagree Strongly Disagree                     Agree    Strongly Agree            Strongly Agree
3 Neither agree or disagree                     Agree             Agree Neither agree or disagree          Disagree         Strongly Disagree
4         Strongly Disagree            Strongly Agree    Strongly Agree Neither agree or disagree Strongly Disagree Neither agree or disagree
5                     Agree         Strongly Disagree    Strongly Agree         Strongly Disagree    Strongly Agree Neither agree or disagree
6                     Agree                  Disagree    Strongly Agree                     Agree    Strongly Agree         Strongly Disagree
                 V7                        V8                        V9                       V10
1 Strongly Disagree Neither agree or disagree                  Disagree            Strongly Agree
2    Strongly Agree            Strongly Agree         Strongly Disagree            Strongly Agree
3             Agree Neither agree or disagree Neither agree or disagree                  Disagree
4          Disagree         Strongly Disagree                     Agree         Strongly Disagree
5          Disagree            Strongly Agree Neither agree or disagree Neither agree or disagree
6    Strongly Agree Neither agree or disagree                     Agree         Strongly Disagree
> lookuptable
                    answers values
1            Strongly Agree      5
2                     Agree      4
3 Neither agree or disagree      3
4                  Disagree      2
5         Strongly Disagree      1

注意:在上述解决方案中,我们假设 OP 希望根据查找表更改“df”中的所有列。如果只有一部分列需要更改,请仅选择感兴趣的列(基于位置索引或列名)。假设,如果有一列是我们不需要包含的第一列,在索引之前使用-进行选择,对数据子集进行转换,并分配回相同的选择数据列

df[-1] <- lookuptable$values[match(as.matrix(df[-1]), lookuptable$answers)]

如果要删除多列,使用c()追加索引

df[-c(1, 5)] <- lookuptable$values[match(as.matrix(df[-c(1, 5)]), 
       lookuptable$answers)]

或者如果我们需要选择没有前 3 个的

df[-(1:3)] <- lookuptable$values[match(as.matrix(df[-(1:3)]), 
        lookuptable$answers)]

数据

set.seed(24)
df <- as.data.frame(matrix(sample(lookuptable$answers, 20 * 10, 
          replace = TRUE), 20, 10))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多