是Ifelse ...在此处使用的正确函数吗?

时间:2019-08-08 18:27:09

标签: r

我正在尝试使用ifelse填充数据框中的新列。 如果长度大于3,我想提取一列字符串的最后一位数字。如果字符字符串较短,我只希望它给出-1 ...

我已经想出了如果字符串长于3个字符,则如何提取字符串的最后一个字符。


x<- c("ABCD1", "ABCD2", "ABCD3", "ABCD4", "BC5", "BC6", "BC7")
y<-NULL
dat<-cbind(x,y)

ifelse (nchar(x>3), y=substr(x, 5,5), y=-1)

dat<-cbind(x,y)
view(dat)

运行此命令时,我会收到下一个错误

  Error in ifelse(nchar(x > 3), y = substr(x, 4, 5), y = substr(x, 3)) : 
   formal argument "yes" matched by multiple actual arguments`

我想要的是向量“ y”得到数字1,2,3,4,-1,-1,-1 这样我就可以在后面绑定两个列。如果您有更好的方法,我将不胜感激。

2 个答案:

答案 0 :(得分:1)

您快到了!只要长度大于3的字符串长度为4个字符,此方法就可以使用。

ifelse(nchar(x) > 3, substr(x, 5, 5), -1)

如果您的字符串可能超过4个字符:

ifelse(nchar(x) > 3, sub(".*([0-9]).*", "\\1", x), -1)

答案 1 :(得分:0)

我猜您需要一个数据框。这可能就是您需要的-

x <- c("ABCD1", "ABCD2", "ABCD3", "ABCD4", "BC5", "BC6", "BC7")
dat <- data.frame(x, stringsAsFactors = F)

dat$y <- ifelse(nchar(dat$x) > 3, as.numeric(substr(dat$x, 5,5)), -1)

      x  y
1 ABCD1  1
2 ABCD2  2
3 ABCD3  3
4 ABCD4  4
5   BC5 -1
6   BC6 -1
7   BC7 -1