单元格中的反转数字除以小数点

时间:2018-01-31 00:59:39

标签: r dataframe

我有一个像这样的损坏的价格表:

h1.whatwedo {
  position: relative;
  top:30px;
}

价格涨跌如你在第1行所见......

          price
1         06.4
2         80.80
3         40.22
4         42.50
5         21.54
6         25.22
7         07.30
8         287.85
9         6.40
10        221.85
11        10.6
12        22.72
13        23.4
14        4.22

......应该......

1         06.4
         ...
7         07.30

......等等。

如果小数点后面的数字只有一个数字,则该数字必须首先。

例如:
价格看起来像9.90或19.00但不像09.90或00.19。所以,如果它是09.90那么实际应该是90.09。

有人有想法吗?

2 个答案:

答案 0 :(得分:2)

这应该有效:

# Sample data
df <- read.table(text =
    "          price
1         06.4
2         80.80
3         40.22
4         42.50
5         21.54
6         25.22
7         47.30
8         287.85
9         6.40
10        221.85
11        10.6
12        22.72
13        23.4
14        4.22", colClasses = "character", header = T)

df$corrected_price <- sapply(strsplit(df$price, "\\."), function(x) {
    if (nchar(x[2]) == 1) x <- rev(x);
    paste(x, collapse = ".");
})
df;
#    price corrected_price
#1    06.4            4.06
#2   80.80           80.80
#3   40.22           40.22
#4   42.50           42.50
#5   21.54           21.54
#6   25.22           25.22
#7   47.30           47.30
#8  287.85          287.85
#9    6.40            6.40
#10 221.85          221.85
#11   10.6            6.10
#12  22.72           22.72
#13   23.4            4.23
#14   4.22            4.22

或者没有sapply的其他方法:

mat <- matrix(unlist(strsplit(df$price, "\\.")), ncol = 2, byrow = TRUE);
mat[nchar(mat[, 2]) == 1, ] <- mat[nchar(mat[, 2]) == 1, ][, 2:1];
df$corrected_price <- apply(mat, 1, paste, collapse = ".");

答案 1 :(得分:1)

我没有覆盖列var firstSet = new List<string> { "car", "bus", "boat", "plane" }; var secondSet = new List<string> { "bicycle", "car", "boat", "motorcycle" }; var secondPercentCoverageOfFirst = (double)firstSet.Intersect(secondSet).Count() / firstSet.Count() * 100; ,因此您可以比较并查看 需要颠倒的行1 11 13 15 16 17确实是相反的。标准是以零开头的任何数字都需要反转,并且任何以分数中的一位数结尾的数字也应该相反:

a

DATA:

transform(df,b=sub("(\\b0.*)\\.(.*)|(.*)\\.(\\d\\b)","\\2\\4.\\1\\3",a))
        a      b
1    06.4   4.06
2   80.80  80.80
3   40.22  40.22
4   42.50  42.50
5   21.54  21.54
6   25.22  25.22
7   47.30  47.30
8  287.85 287.85
9    6.40   6.40
10 221.85 221.85
11   10.6   6.10
12  22.72  22.72
13   23.4   4.23
14   4.22   4.22
15  00.99  99.00
16   01.9   9.01
17   10.3   3.10