2

假设我有一个数据集:

test = data.frame(x=c(1:11), y=as.character(c(1:11)))

其中“y”列由字符/字符串组成。现在,我想更改包含两个字符的字符串(即 test[10,2] & test[11,2]),以便这些字符串以字符“0”开头。结果将是“010”和“011”,而其他字符串(只有一个字符)保持不变。对我来说,合乎逻辑的解决方案是:

test[nchar(test[,2])==2,2] = paste(c("0", test[nchar(test[,2])==2,2]), collapse="")

实际上,只有 test[10,2] 和 test[11,2] 受到影响。奇怪的是,结果是 test[10,2] = "01011",而 test[11,2] = "01011"。这意味着具有两个字符的所有字符串都与前面的“0”一起粘贴。这绝对不是我想看到的。

当满足某些条件(长度)时,我应该怎么做才能将一个字符添加到数据集中的字符串中?您的回答将不胜感激。

4

3 回答 3

4

利用

paste("0", test[nchar(test[,2])==2,2], sep="")

所以例如

> test[nchar(test[,2])==2,2] = paste("0", test[nchar(test[,2])==2,2], sep="")
> test
    x   y
1   1   1
2   2   2
3   3   3
4   4   4
5   5   5
6   6   6
7   7   7
8   8   8
9   9   9
10 10 010
11 11 011

collapse并且sep有不同的属性

> paste(1,c(2:3),collapse=',')
[1] "1 2,1 3"
> paste(1,c(2:3),sep=',')
[1] "1,2" "1,3"
于 2012-07-19T15:49:48.043 回答
3

也许使用它会更具可读性ifelse

transform(test,y=ifelse(nchar(y)==2,paste0("0",y),y))
    x   y
1   1   1
2   2   2
3   3   3
4   4   4
5   5   5
6   6   6
7   7   7
8   8   8
9   9   9
10 10 010
11 11 011
于 2012-07-19T15:57:15.903 回答
2

我会像 ttmaccer 建议的那样做同样的事情,除了我会使用 paste0,它会自动连接它们而没有任何空格。它比粘贴更有效,所以如果你有一个大数据集,它可能是值得的。这意味着您也不必记住“sep”参数。

test[nchar(test[,2])==2,2] = paste0("0", test[nchar(test[,2])==2,2])
于 2012-07-19T15:54:51.383 回答