假设我有一个数据集:
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="")
确实,只测试[10,2]&测试[11,2]受到影响。奇怪的是,结果是test [10,2] =“01011”,而test [11,2] =“01011”。这意味着所有具有两个字符的字符串都粘贴在一起,前面带有“0”。这绝对不是我想看到的。
当满足某些条件(长度)时,我应该怎么做才能在数据集中的字符串中只添加一个字符? 非常感谢您的回答。
答案 0 :(得分: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"
答案 1 :(得分: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
答案 2 :(得分:2)
我会做与ttmaccer建议相同的事情,除了我会使用paste0,它自动连接它们没有任何空格。它比粘贴更有效,所以如果你有一个大的数据集,它是值得做的。这意味着您不必记住'sep'参数。
test[nchar(test[,2])==2,2] = paste0("0", test[nchar(test[,2])==2,2])