我有以下R数据框。专栏"州"是一个因子列。 我有两个问题:
1-我想创建一个标志,以确定每一行(状态值)是否为数字或 字符。 1如果是字符,0如果是数字
ID state
1 123fg^>
2 fhgfh@
3 125@!
4 125
我希望输出看起来像这样
ID state Flag
1 123fg^> 1
2 fhgfh@ 1
3 125@! 1
4 125 0
2-接下来,如果单元格包含数字,我想创建1或0的标志。所以对于同一个例子,我希望得到以下输出
ID state Flag
1 123fg^> 1
2 fhgfh@ 0
3 125@! 1
4 125 1
答案 0 :(得分:5)
对于这两种情况,我们可以使用grep
来匹配从开头([0-9]+
)到结尾(^
)
$
)
as.integer(!grepl("^[0-9]+$", df$state))
#[1] 1 1 0
或从开始到结束的一个或多个字母([A-Za-z]+
),做一个否定(!
)并将逻辑向量转换为二进制
as.integer(!grepl("^[A-Za-z]+$", df$state))
#[1] 1 0 1
答案 1 :(得分:2)
一种稍微强大的数字检测方法(基于akrun的答案)
as.integer(grepl("[0-9]",df$state))
#> [1] 1 0 1
由于您要求包含数字的字符串,这是一个更简单的解决方案,并且还处理纯标点符号的情况。
as.integer(grepl("[0-9]","!?"))
#> [1] 0
as.integer(!grepl("^[A-Za-z]+$", "?!"))
#> [1] 1
答案 2 :(得分:1)
使用gsub
的选项可以是:
as.numeric(gsub("[0-9]|\\.","",df$state) != "")
[1] 1 1 1 0
|\\.
=>这将允许检测具有分数(即125.8)