我有一个包含名称列和值列的数据框:
AllowAnonymous
我希望将B列中的字词转换为零,如下所示:
a <- c("Bob","Jane","Susan","Greg")
b <- c(10, "Jane", 14, "Greg")
df = data.frame(a,b)
df
a b
1 Bob 10
2 Jane Jane
3 Susan 14
4 Greg Greg
提前致谢!
答案 0 :(得分:3)
我强迫b
加入numeric
并将其留在那里。由于b
最初是factor
,我首先将其强制转移到character
。
df$b = as.numeric(as.character(df$b))
#Warning message:
#NAs introduced by coercion
df$b
#[1] 10 NA 14 NA
如果您愿意,可以用NA
替换0
,但我会保留NA
)
df$b[is.na(df$b)] = 0
df$b
#[1] 10 0 14 0
当然,您可以使用gsub
将非数字字符(\\D+
)替换为"0"
。请注意,gsub
会自动强制转换为character
。
gsub(pattern = "\\D+", replacement = "0", x = df$b)
#[1] "10" "0" "14" "0"
答案 1 :(得分:0)
我不是R专家,但我相信,根据上面的评论,df$b = as.numeric(gsub("[^0-9]", "0", df$b))
可以正常工作。
更具体地说,将您的代码更改为:
a <- c("Bob","Jane","Susan","Greg")
b <- c(10, "Jane", 14, "Greg")
df = data.frame(a,b)
df$b = as.numeric(gsub("[^0-9]", "0", df$b))
df
它与您拥有的代码相同,但是使用as.numeric来操纵b向量的新行转换为数字和gsub,这允许您迭代向量并对每个值应用正则表达式(more information)。
gsub的第一个参数是正则表达式 - 在这种情况下,我们使用[^0-9]
,它将匹配任何非数字值(请记住,如果特殊字符可能在你的号码)。正则表达式可以在这里轻松方便地进行测试:regex101。
第二个参数是当正则表达式没有通过时用当前值替换的内容。
第三个参数是迭代的向量。
然后将新向量传递给as.numeric
方法。
下面的代码段可以在R-Fiddle上看到,here
同样,我不是R程序员,但我认为这可以回答你的问题。