0

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

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

4

3 回答 3

4

这是一种使用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)
于 2012-11-27T09:34:38.653 回答
2

paste(' ',d[d[,1] > 0,])这看起来像你想要的吗?

于 2012-11-27T08:07:08.510 回答
0

s的print方法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])

然后,您可以使用以下方法捕获printed 对象capture.output

> (dStr <- capture.output(print(myChar, print.gap = 0, row.names = FALSE)))
[1] "  NA" "   4" "-1.5" "   5" "  -3"

由于还打印了列名,因此您可以对对象进行子集化:

> dStr[-1]
[1] "   4" "-1.5" "   5" "  -3"

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

于 2012-11-27T21:11:55.323 回答