清理 R 中凌乱的字符列
cleaning a messy character column in R
我有一栏如下
Id Feedback
1 c("No", "No", "No", "No", "No", "No")
2 c("No", "No", "No")
3 c("No", "No", "No", "No", "Taking Medication")
我正在尝试去掉 No,这样清理后的最终结果应该如下所示
Id Feedback
1
2
3 "Taking Medication"
我尝试使用函数 sub
它没有用。我使用 gsub
捆绑了该功能,但结果很混乱。当我使用 df1$Feedback = gsub("No", "", df1$Feedback)
时,结果如下所示
Id Feedback
1 c("", "", "", "", "", "")
2 c("", "", "")
3 c("", "", "", "", "Taking Medication")
非常感谢有关此问题的任何帮助。
library(dplyr)
library(tidyr)
your_data_frame %>%
group_by(Id) %>%
do(.$Feedback %>%
parse(text = .) %>%
eval %>%
{data_frame(Feedback = .)}) %>%
filter(Feedback != "No")
我们将 'Feedback' 列拆分为 'No' 或 (|
) 引用 ("
)。输出是 list
。我们使用 vapply
、grep
循环遍历 list
以获取字母元素的数字索引或 space 从字符串的开始到结束(^[A-Za-z ]$
).我们创建一个逻辑条件,即if
索引的length
大于0,我们return对应'x1'或else
[=44的元素=] NA
。
df1$Feedback <- vapply(strsplit(df1$Feedback, 'No|"'), function(x) {
x1 <- grep('^[A-Za-z ]+$', x)
if(length(x1)>0) x[x1]
else ''}, character(1))
df1
# Id Feedback
#1 1
#2 2
#3 3 Taking Medication
或者另一个选项是 gsub
。我们匹配子字符串 'No' 或 (|
) 双引号、逗号、括号 ([",()]
) 或 (|
) 字母 'c' 后跟括号 (c(?:\()
) 并将其替换为 ''
。 leading/lagging space 可以使用第二个 gsub
.
删除
gsub('^\s*|\s*$', '',
gsub('No|[",()]|c(?:\()', '', df1$Feedback, perl=TRUE))
#[1] "" "" "Taking Medication"
数据
df1 <- structure(list(Id = 1:3,
Feedback = c("c(\"No\", \"No\", \"No\", \"No\", \"No\", \"No\")",
"c(\"No\", \"No\", \"No\")", "c(\"No\", \"No\", \"No\", \"No\", \"Taking Medication\")"
)), .Names = c("Id", "Feedback"), class = "data.frame",
row.names = c(NA, -3L))
我有一栏如下
Id Feedback
1 c("No", "No", "No", "No", "No", "No")
2 c("No", "No", "No")
3 c("No", "No", "No", "No", "Taking Medication")
我正在尝试去掉 No,这样清理后的最终结果应该如下所示
Id Feedback
1
2
3 "Taking Medication"
我尝试使用函数 sub
它没有用。我使用 gsub
捆绑了该功能,但结果很混乱。当我使用 df1$Feedback = gsub("No", "", df1$Feedback)
时,结果如下所示
Id Feedback
1 c("", "", "", "", "", "")
2 c("", "", "")
3 c("", "", "", "", "Taking Medication")
非常感谢有关此问题的任何帮助。
library(dplyr)
library(tidyr)
your_data_frame %>%
group_by(Id) %>%
do(.$Feedback %>%
parse(text = .) %>%
eval %>%
{data_frame(Feedback = .)}) %>%
filter(Feedback != "No")
我们将 'Feedback' 列拆分为 'No' 或 (|
) 引用 ("
)。输出是 list
。我们使用 vapply
、grep
循环遍历 list
以获取字母元素的数字索引或 space 从字符串的开始到结束(^[A-Za-z ]$
).我们创建一个逻辑条件,即if
索引的length
大于0,我们return对应'x1'或else
[=44的元素=] NA
。
df1$Feedback <- vapply(strsplit(df1$Feedback, 'No|"'), function(x) {
x1 <- grep('^[A-Za-z ]+$', x)
if(length(x1)>0) x[x1]
else ''}, character(1))
df1
# Id Feedback
#1 1
#2 2
#3 3 Taking Medication
或者另一个选项是 gsub
。我们匹配子字符串 'No' 或 (|
) 双引号、逗号、括号 ([",()]
) 或 (|
) 字母 'c' 后跟括号 (c(?:\()
) 并将其替换为 ''
。 leading/lagging space 可以使用第二个 gsub
.
gsub('^\s*|\s*$', '',
gsub('No|[",()]|c(?:\()', '', df1$Feedback, perl=TRUE))
#[1] "" "" "Taking Medication"
数据
df1 <- structure(list(Id = 1:3,
Feedback = c("c(\"No\", \"No\", \"No\", \"No\", \"No\", \"No\")",
"c(\"No\", \"No\", \"No\")", "c(\"No\", \"No\", \"No\", \"No\", \"Taking Medication\")"
)), .Names = c("Id", "Feedback"), class = "data.frame",
row.names = c(NA, -3L))