将数据框中的所有字符串更改为几个不同值 r 之一(不是重复的)
change all strings in dataframe to one of several different values r (NOT a duplicate)
(请参阅下面的“重要”注释 - 问题未通过类似 post 的答案解决;它 不是 重复)
我有一堆带有大量向量的数据帧,其中包含我需要从字符串(当前作为因子)重新编码为数值(1 到 5)的相同的两个李克特量表。这是比例尺:
Likert scale A:
---------------
Terrible = 1
Below Average = 2
Average = 3
Above Average = 4
Excellent = 5
Likert Scale B:
---------------
Strongly disagree = 1
Somewhat disagree = 2
Meh = 3
Somewhat agree = 4
Strongly agree = 5
例如,这里是 HAVE1
,具有这些李克特模式的众多数据集之一(每个数据集都有不同数量的向量和不同的向量名称):
Apples Oranges Bananas ServiceGood ShortTime
Excellent Terrible Average Somewhat agree Somewhat agree
Excellent Above Average Strongly agree Somewhat agree
Above Average Terrible Below Average Somewhat disagree
Excellent Average Below Average Meh Strongly disagree
Below Average Terrible Above Average Somewhat agree Meh
… … … … …
我需要用上面列出的李克特量表代码中的等效数字替换字符串。例如,WANT1
的前 5 个观察值应该如下所示:
Apples Oranges Bananas ServiceGood ShortTime
5 1 3 4 4
5 NA 4 5 4
4 1 2 NA 2
5 3 2 3 5
2 1 4 4 3
… … … … …
我正在寻找修改这些值的有效方法,由于我所有 HAVE
数据帧中名称和位置的差异,不需要调用任何矢量名称。有什么想法吗?
重要提示:问题“Dictionary style replace multiple items”中提供的任何示例都无法解决此问题;每个答案都会引发某种错误,或者用 NA/replaces 错误的值填充大多数变量的值。
例如下面的代码...
map = setNames(c("Excellent", "Above Average", "Below Average", "Average", "Terrible"),
c("5", "4", "2", "3", "1"))
HAVE1[] <- map[unlist(HAVE1)]
将我文件中的每个值都设置为 NA,除了空单元格,它编码为 "Terrible"。 "dictionaries" 答案中另一个问题的唯一解决方案是提问者在问题本身中提出的解决方案 - 提问者希望避免这种方法。
我目前使用一组 lapply() 调用,这些调用使用 gsub() 在每个字符串上查找匹配项,然后用李克特量表的数值替换该匹配项。例如:
WANT1 <- data.frame(lapply(HAVE1, function(a){gsub("Excellent", 5, a)}))
WANT1 <- data.frame(lapply(WANT1, function(b){gsub("Above Average", 4, b)}))
WANT1 <- data.frame(lapply(WANT1, function(d){gsub("Below Average", 2, d)}))
WANT1 <- data.frame(lapply(WANT1, function(c){gsub("Average", 3, c)}))
WANT1 <- data.frame(lapply(WANT1, function(e){gsub("Terrible", 1, e)}))
WANT1 <- data.frame(lapply(WANT1, function(a){gsub("Strongly agree", 5, a)}))
WANT1 <- data.frame(lapply(WANT1, function(b){gsub("Somewhat agree", 4, b)}))
WANT1 <- data.frame(lapply(WANT1, function(d){gsub("Somewhat disagree", 2, d)}))
WANT1 <- data.frame(lapply(WANT1, function(c){gsub("Meh", 3, c)}))
WANT1 <- data.frame(lapply(WANT1, function(e){gsub("Strongly Disagree", 1, e)}))
我将其嵌套在一个循环中,循环遍历所有 HAVE
数据帧并生成所有 WANT
数据帧,但我正在寻找替代方法来实现相同的目标。有什么想法吗?
这是使用 dplyr::mutate_all 的快速方法。 str_replace
允许我们在有空字符串的地方插入缺失值,然后 recode
让我们快速将文本级别替换为所需的数字级别。这根本不需要您知道每个数据框中列的名称。请注意,这将通过将它们设置为 NA
来处理无法识别的选项,这也会提醒您数据中存在拼写错误。如果您不想以这种方式重新编码每个数据框中的列,您也可以查看 mutate_at
。
为了处理您需要应用到多个数据框的事实,如果有太多无法手动应用此功能,我会将它们存储为列表的元素,然后 map
跨越列表。
library(tidyverse)
df <- read_table(
"Apples Oranges Bananas ServiceGood ShortTime
Excellent Terrible Average Somewhat agree Somewhat agree
Excellent Above Average Strongly agree Somewhat agree
Above Average Terrible Below Average Somewhat disagree
Excellent Average Below Average Meh Strongly disagree
Below Average Terrible Above Average Somewhat agree Meh"
)
df %>%
mutate_all(~ str_replace(., "^$", NA_character_)) %>%
mutate_all(
.funs = ~ as.integer(recode(
.x = .,
"Terrible" = 1,
"Below Average" = 2,
"Average" = 3,
"Above Average" = 4,
"Excellent" = 5,
"Strongly disagree" = 1,
"Somewhat disagree" = 2,
"Meh" = 3,
"Somewhat agree" = 4,
"Strongly agree" = 5
))
)
#> # A tibble: 5 x 5
#> Apples Oranges Bananas ServiceGood ShortTime
#> <int> <int> <int> <int> <int>
#> 1 5 1 3 4 4
#> 2 5 NA 4 5 4
#> 3 4 1 2 NA 2
#> 4 5 3 2 3 1
#> 5 2 1 4 4 3
由 reprex package (v0.2.0) 创建于 2018-05-29。
(请参阅下面的“重要”注释 - 问题未通过类似 post 的答案解决;它 不是 重复)
我有一堆带有大量向量的数据帧,其中包含我需要从字符串(当前作为因子)重新编码为数值(1 到 5)的相同的两个李克特量表。这是比例尺:
Likert scale A:
---------------
Terrible = 1
Below Average = 2
Average = 3
Above Average = 4
Excellent = 5
Likert Scale B:
---------------
Strongly disagree = 1
Somewhat disagree = 2
Meh = 3
Somewhat agree = 4
Strongly agree = 5
例如,这里是 HAVE1
,具有这些李克特模式的众多数据集之一(每个数据集都有不同数量的向量和不同的向量名称):
Apples Oranges Bananas ServiceGood ShortTime
Excellent Terrible Average Somewhat agree Somewhat agree
Excellent Above Average Strongly agree Somewhat agree
Above Average Terrible Below Average Somewhat disagree
Excellent Average Below Average Meh Strongly disagree
Below Average Terrible Above Average Somewhat agree Meh
… … … … …
我需要用上面列出的李克特量表代码中的等效数字替换字符串。例如,WANT1
的前 5 个观察值应该如下所示:
Apples Oranges Bananas ServiceGood ShortTime
5 1 3 4 4
5 NA 4 5 4
4 1 2 NA 2
5 3 2 3 5
2 1 4 4 3
… … … … …
我正在寻找修改这些值的有效方法,由于我所有 HAVE
数据帧中名称和位置的差异,不需要调用任何矢量名称。有什么想法吗?
重要提示:问题“Dictionary style replace multiple items”中提供的任何示例都无法解决此问题;每个答案都会引发某种错误,或者用 NA/replaces 错误的值填充大多数变量的值。
例如下面的代码...
map = setNames(c("Excellent", "Above Average", "Below Average", "Average", "Terrible"),
c("5", "4", "2", "3", "1"))
HAVE1[] <- map[unlist(HAVE1)]
将我文件中的每个值都设置为 NA,除了空单元格,它编码为 "Terrible"。 "dictionaries" 答案中另一个问题的唯一解决方案是提问者在问题本身中提出的解决方案 - 提问者希望避免这种方法。
我目前使用一组 lapply() 调用,这些调用使用 gsub() 在每个字符串上查找匹配项,然后用李克特量表的数值替换该匹配项。例如:
WANT1 <- data.frame(lapply(HAVE1, function(a){gsub("Excellent", 5, a)}))
WANT1 <- data.frame(lapply(WANT1, function(b){gsub("Above Average", 4, b)}))
WANT1 <- data.frame(lapply(WANT1, function(d){gsub("Below Average", 2, d)}))
WANT1 <- data.frame(lapply(WANT1, function(c){gsub("Average", 3, c)}))
WANT1 <- data.frame(lapply(WANT1, function(e){gsub("Terrible", 1, e)}))
WANT1 <- data.frame(lapply(WANT1, function(a){gsub("Strongly agree", 5, a)}))
WANT1 <- data.frame(lapply(WANT1, function(b){gsub("Somewhat agree", 4, b)}))
WANT1 <- data.frame(lapply(WANT1, function(d){gsub("Somewhat disagree", 2, d)}))
WANT1 <- data.frame(lapply(WANT1, function(c){gsub("Meh", 3, c)}))
WANT1 <- data.frame(lapply(WANT1, function(e){gsub("Strongly Disagree", 1, e)}))
我将其嵌套在一个循环中,循环遍历所有 HAVE
数据帧并生成所有 WANT
数据帧,但我正在寻找替代方法来实现相同的目标。有什么想法吗?
这是使用 dplyr::mutate_all 的快速方法。 str_replace
允许我们在有空字符串的地方插入缺失值,然后 recode
让我们快速将文本级别替换为所需的数字级别。这根本不需要您知道每个数据框中列的名称。请注意,这将通过将它们设置为 NA
来处理无法识别的选项,这也会提醒您数据中存在拼写错误。如果您不想以这种方式重新编码每个数据框中的列,您也可以查看 mutate_at
。
为了处理您需要应用到多个数据框的事实,如果有太多无法手动应用此功能,我会将它们存储为列表的元素,然后 map
跨越列表。
library(tidyverse)
df <- read_table(
"Apples Oranges Bananas ServiceGood ShortTime
Excellent Terrible Average Somewhat agree Somewhat agree
Excellent Above Average Strongly agree Somewhat agree
Above Average Terrible Below Average Somewhat disagree
Excellent Average Below Average Meh Strongly disagree
Below Average Terrible Above Average Somewhat agree Meh"
)
df %>%
mutate_all(~ str_replace(., "^$", NA_character_)) %>%
mutate_all(
.funs = ~ as.integer(recode(
.x = .,
"Terrible" = 1,
"Below Average" = 2,
"Average" = 3,
"Above Average" = 4,
"Excellent" = 5,
"Strongly disagree" = 1,
"Somewhat disagree" = 2,
"Meh" = 3,
"Somewhat agree" = 4,
"Strongly agree" = 5
))
)
#> # A tibble: 5 x 5
#> Apples Oranges Bananas ServiceGood ShortTime
#> <int> <int> <int> <int> <int>
#> 1 5 1 3 4 4
#> 2 5 NA 4 5 4
#> 3 4 1 2 NA 2
#> 4 5 3 2 3 1
#> 5 2 1 4 4 3
由 reprex package (v0.2.0) 创建于 2018-05-29。