将前导空格添加到数据框中的某些值

时间:2012-11-27 08:02:58

标签: r grep gsub

我有以下数据框和每个正数(是的,它们需要存储为字符串)我想添加一个前导空格。

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?是吗?

3 个答案:

答案 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"

这样,您不必知道最长字符串的长度,这可以处理大多数数据类型,而不仅仅是字符。