我有一个问题,理想情况下,我需要根据字符串的长度创建新值和新行。
这是我的源数据:
NumericCode1=c("12345","1234")
NumericCode2=c("0123.45","123.4")
AlphaCode=c("","")
df=data.frame(NumericCode1,NumericCode2,AlphaCode)
我想做的是使用以下逻辑处理此数据:
如果NumericCode1或NumericCode2中的任何一个值都大于5(仅对数字计数),那么我想用每个AA:BB:CC值填充AlphaCode。因此df最终看起来像这样:
NumericCode1=c("12345","1234")
NumericCode2=c("0123.45","123.4")
AlphaCode=c("AA:BB:CC","")
df=data.frame(NumericCode1,NumericCode2,AlphaCode)
然后,我可以使用此代码为每个代码创建单独的记录,并获得所需的输出。
df %>%
separate_rows(AlphaCode, sep=":")
NumericCode1 NumericCode2 AlphaCode
1 12345 0123.45 AA
2 12345 0123.45 BB
3 12345 0123.45 CC
4 1234 123.4
我的问题是我被困在第一步。我可以使用nchar
或str_lenght
来计数字符串中的字符,但是我无法弄清楚如何“ 计数> 5,然后这样做”。
非常感谢任何帮助。谢谢!
答案 0 :(得分:1)
您可以使用replace
cond <- nchar(sub("\\D", "", df$NumericCode1)) > 5 | nchar(sub("\\D", "", df$NumericCode2)) > 5
df$AlphaCode <- replace(df$AlphaCode,
cond,
"AA:BB:CC")
df
# NumericCode1 NumericCode2 AlphaCode
#1 12345 0123.45 AA:BB:CC
#2 1234 123.4
条件表明NumericCode1
或NumericCode2
的字符数是否超过5个(仅数字)-将""
替换为AA:BB:CC
。
数据
df = data.frame(NumericCode1, NumericCode2, AlphaCode, stringsAsFactors = FALSE)
# ^^^^^^^^^^^^^^^^^^^^^^^^
答案 1 :(得分:1)
使用stringr::str_count
和\\d
我们只能计算数字
library(dplyr)
library(stringr)
df %>% mutate(Cond=if_else(str_count(NumericCode1,'\\d')>5|str_count(NumericCode2,'\\d')>5 ,
'AA:BB:CC',''))
NumericCode1 NumericCode2 Cond
1 12345 0123.45 AA:BB:CC
2 1234 123.4