【发布时间】:2019-07-28 08:18:49
【问题描述】:
我有一个包含来自世界各地的参与者的大型数据集。其中一些参与者使用点/句点/逗号输入数据来表示千位分隔符,但 R 将它们读取为逗号,这完全扭曲了我的数据...... 例如1234 变成 1,234。
我想删除所有点/句点/逗号。我的数据完全由完整的数字组成,因此任何地方都不应该有任何小数。
我尝试使用 stringr,但不太明白。这是一个(我希望)可重复的示例,其中包含我的一小部分数据:
structure(
list(
chnb = c(10L, 35L, 55L),
B1_1_77 = c(117.586,
4022, 4.921),
C1_1_88 = c(NA, 2206, 1.111),
C1_1_99 = c(6.172,
1884, 0),
C1_3_99 = c(5.62, 129, 0)
),
row.names = c(NA,-3L),
class = c("tbl_df",
"tbl", "data.frame")
)
我试过了:
prob1 <- prob %>% str_replace_all('\\.', '')
这给了我这个:
> prob
[1] "c(10, 35, 55)" "c(117586, 4022, 4921)" "c(NA, 2206, 1111)"
[4] "c(6172, 1884, 0)" "c(562, 129, 0)"
它确实删除了点,但它给了我一个简单的列表,并且完全丢失了我的数据结构。在线搜索建议我这样做:
prob1 <- prob %>% mutate_all(list(str_replace(., '\\.', '')))
但我收到一条错误消息:
错误:
.fn必须是长度为 1 的字符串 致电rlang::last_error()查看回溯 另外:警告信息: 在 stri_replace_first_regex(string, pattern, fix_replacement(replacement), 中: 参数不是原子向量;胁迫
我是不是把整件事都搞错了?任何帮助将不胜感激。我希望我的问题足够清楚,如果不是很抱歉(我是新手)。
【问题讨论】:
-
我无法重现您的错误消息,但请尝试
prob %>% mutate_all(funs(str_replace_all(.,'[\\.,]','')))删除所有.和,。在大多数 R 正则表达式情况下,您需要将转义的 \ 加倍,如果您想做任何复杂的事情,mutate_all通常需要funs()包装函数。 -
prob是您发布dput的数据框吗? -
@CriminallyVulgar 成功了!!!非常感谢你。我如何为您提供快速有效的帮助?
-
嗯,所以它可以工作,但现在我的变量是字符:/我试图将所有内容包装在 as.numeric() 中但收到错误消息:prob % as.numeric(mutate_all (funs(str_replace_all(.,'[\\.,]','')))) UseMethod("tbl_vars") 中的错误:没有适用于“fun_list”类对象的“tbl_vars”方法
-
@camille,正确!