我有以下数据框和每个正数(是的,它们需要存储为字符串)我想添加一个前导空格。
d <- data.frame(c1 = c("4", "-1.5", "5", "-3"))
> d
c1
1 4
2 -1.5
3 5
4 -3
到目前为止,我使用grep和invert只返回我想要添加前导空格的正数:
d$c1[grep("-", d$c1, invert = TRUE)]
但是,我不知道该怎么办。我想我宁愿使用索引而不是实际数字。并且可能包含gsub?是吗?
答案 0 :(得分:3)
以下是使用formatC()
的方法。使用sprintf()
可以获得类似的结果。请注意,我不只是添加一个空格。相反,这种方法将每个字符串填充到最大宽度。
d <- data.frame(c1 = c("4", "-1.5", "5", "-3"), stringsAsFactors = FALSE)
d <- transform(d, d2 = formatC(c1, width = 4), stringsAsFactors = FALSE)
R> d
c1 d2
1 4 4
2 -1.5 -1.5
3 5 5
4 -3 -3
R> str(d)
'data.frame': 4 obs. of 2 variables:
$ c1: chr "4" "-1.5" "5" "-3"
$ d2: chr " 4" "-1.5" " 5" " -3"
如果您事先不知道width
参数应该是什么,请从d$c1
计算:
R> with(d, max(nchar(as.character(c1))))
[1] 4
或直接使用它
d <- transform(d, d2 = formatC(c1, width = max(nchar(as.character(c1)))),
stringsAsFactors = FALSE)
答案 1 :(得分:1)
paste(' ',d[d[,1] > 0,])
看起来像你想要的那样?
答案 2 :(得分:0)
print
的{{1}}方法具有很好的自动填充功能。通常,字符串在左侧填充空格以确保正确对齐(默认情况下)。您可以通过捕获打印输出来利用此功能。例如,使用您的data.frame
:
d
参数> print(d, print.gap = 0, row.names = FALSE)
c1
4
-1.5
5
-3
确保最长字符串前面没有额外的填充空格。 print.gap = 0
可防止打印行名称。
这种情况有两种特殊之处:列名比数据中最长的字符串短,而row.names = FALSE
只有一列。要概括,您可以对数据进行子集化,并data.frame
:
unname
然后,您可以使用myChar <- unname(d[, 1, drop = FALSE])
print
ed对象
capture.output
由于还打印了列名,因此可以对对象进行子集化:
> (dStr <- capture.output(print(myChar, print.gap = 0, row.names = FALSE)))
[1] " NA" " 4" "-1.5" " 5" " -3"
这样,您不必知道最长字符串的长度,这可以处理大多数数据类型,而不仅仅是字符。