1

Question: how can I specifically add .0 to all df$x-values not containing decimals?

Take the following a dataframe

df <- data.frame(x=c("2.8","9","0.5","1.2","4","12"))

> head(df)

    x
1 2.8
2   9
3 0.5
4 1.2
5   4
6  12

The desired result looks like this

> head(df)
     x
1  2.8
2  9.0
3  0.5
4  1.2
5  4.0
6 12.0

EDIT

I want to automatically add .0 to all integers in ee$x, which is included below.

I tried ee$x <- as.numeric(as.character(ee$x)) but that didn't seem to work. Could anything be wring with my dataframe?

ee$x <- c(0.6, 3.3, 1, 0.6, 0.6, 3.7, 1.4, 1.1, 1.8, 1.6, 0.7, 0.5, 0.3, 
1.7, 0.5, 1.2, 4.1, 0.6, 1.4, 1.3, 1.8, 2.6, 0.7, 0.8, 1, 0.7, 
0.7, 2.1, 1.3, 2.7, 1.3, 0.8, 1.1, 1.8, 1.8, 0.4, 0.9, 6.4, 1.7, 
1.5, 0.6, 2.7, 0.4, 1.5, 1.4, 1.8, 2.3, 0.7, 2.4, 1.2, 0.6, 0.8, 
3, 4, 0.5, 1.2, 5.1, 1.5, 0.6, 1.2, 1.7, 0.7, 1.4, 2.7, 1.1, 
0.9, 0.5, 0.7, 0.9, 0.4, 0.8, 0.8, 0.5, 0.9, 0.5, 1.2, 1.4, 2.5, 
2.7, 4.2, 0.8, 0.5, 1.7, 1.2, 1.6, 0.5, 2.6, 2, 3.9, 0.6, 0.2, 
0.5, 0.8, 0.5, 0.5, 0.6, 1.4, 0.9, 1, 1.8, 3.9, 6.2, 1.9, 0.6, 
0.4, 0.9, 4.3, 7.6, 2.6, 1.6, 1, 0.5, 1.7, 0.7, 1.7, 1.3, 0.8, 
1.2, 1.3, 3, 2.1, 2.1, 1.1, 1.4, 2.2, 5.7, 3, 1, 0.6, 0.5, 0.7, 
1.1, 2.1, 1.6, 0.9, 4.6, 0, 0.6, 1.8, 1.7, 1.6, 1, 1.2, 0.5, 
1.1, 2.9, 0.8, 4.7, 2.5, 1.6, 4, 3, 4, 6, 4, 1, 4, 3, 2, 10, 
3, 3, 5, 4, 5, 2, 4, 3, 4, 4, 4, 2, 4, 2, 2, 3, 7, 4, 4, 6, 3, 
5, 4, 2, 3, 3, 5, 8, 0, 4, 3, 5, 5, 11, 3, 2, 3, 3, 3, 12, 1, 
3, 7, 4, 5, 3, 3, 3, 1, 4, 5, 2, 5, 11, 4, 0, 3, 20, 10, 10, 
3, 2, 4, 5, 3, 4, 2, 4, 5, 3, 4, 7, 7, 4, 6, 4, 10, 3, 2, 4, 
5, 3, 4, 3, 7, 3, 4, 3, 4, 5, 3, 4, 5, 3, 4, 2, 4, 5, 5, 12, 
7, 7, 4, 5, 4, 4, 25, 7, 5, 5, 8, 3, 2, 2, 2, 4, 12, 5, 4, 2, 
35, 3, 9, 4, 7, 14, 3, 2, 3, 6, 4, 1, 8, 5, 2.5, 0, 2, 4, 12, 
18, 4, 6, 6, 6, 2, 1, 4, 8, 16, 20, 23, 10, 5, 5, 12, 35, 2, 
20, 5, 20, 10, 15, 5, 15, 10, 10, 8, 20, 10, 5, 15, 5, 10, 10, 
20, 5, 10, 5, 5, 10, 20, 10, 3, 5, 15, 15, 15, 10, 10, 10, 5, 
5, 8, 10, 15, 5, 5, 5, 10, 13, 5, 10, 8, 8, 5, 4, 5, 10, 20, 
5, 10, 15, 20, 10, 10, 10, 2, 20, 5, 5, 5, 8, 5, 10, 5, 8, 15, 
10, 10, 5, 10, 4, 4, 5, 10, 5, 20, 10, 18, 10, 8, 8, 8, 10, 8, 
10, 15, 10, 10, 10, 40, 30, 8, 3, 30, 10, 20, 5, 5, 10, 20, 10, 
10, 10, 10, 5, 10, 30, 2, 5, 15, 10, 10, 10, 10, 8, 20, 8, 10, 
10, 25, 20, 8, 10, 8, 15, 10, 35, 5, 3, 10, 15, 35, 20, 18, 5, 
3, 8, 8, 15, 10, 30, 10, 8, 8, 10, 15, 5, 5, 15, 10, 10, 15, 
15, 10, 20, 30, 10, 10, 15, 20, 2, 15, 8, 10, 30, 10, 10, 8, 
1.5, 0.6, 1.3, 13.6, 1.6, 3.2, 0.8, 1.6, 2.4, 0.3, 0.5, 0.4, 
0.4, 7.6, 2, 3.8, 0, 2.1, 1.5, 0.5, 2.6, 0.6, 0, 0.9, 21.3, 1.3, 
2.7, 5, 5, 1, 7, 1, 5, 2, 11, 3, 0.8, 1, 0.6, 1, 10, 1, 8, 1, 
1.2, 6.4, 1.6, 1.3, 7, 8, 2, 1, 1, 6, 5.5, 3.9, 1.5, 4, 25.8, 
10, 6, 3.4, 8, 1.1, 3, 1, 3, 11, 2.5, 2, 2, 6, 3.5, 5, 10, 7, 
11, 20, 3, 3, 1, 1.3, 0.7, 0.8, 1.8, 1.8, 2, 2, 2, 5, 2, 5, 1.1, 
3.9, 11, 2, 4.7, 3, 2.2, 4.7, 3.1, 5.6, 1.4, 21.3, 9, 1.6, 3.3, 
1.5, 4, 3, 0.5, 1.2, 2.7, 2.4, 1.8, 2, 4.4, 2, 4, 3, 12, 4, 2, 
6, 3.2, 2, 2, 2, 10.5, 5, 2.5, 4.9, 1.8, 2.7, 7.8, 11.9, 3, 4, 
1, 3, 2, 3, 5, 1, 2, 1, 3, 2, 2, 2, 3, 1, 3, 2, 5, 2, 4, 1, 3, 
2, 2, 1, 4, 5, 1, 1, 1, 1, 2, 3, 3, 3, 2, 2, 1, 4, 1, 1, 1, 3, 
3, 4, 2, 6, 2, 3, 5, 1, 6, 3, 2, 8, 1, 2, 4, 6, 3, 3, 4, 14, 
9, 4, 6, 5, 2, 4, 9, 3, 5, 5, 6, 7, 3, 5, 1, 10, 10, 0, 5, 5, 
5, 5, 50, 1, 0, 2, 2, 2, 2, 5, 10, 2, 5, 2, 20, 5, 5, 0, 2, 5, 
2, 1, 1, 0, 0, 0, 2, 1, 10, 1, 3, 5, 10, 10, 1, 5, 1, 5, 2, 5, 
1, 5, 1, 2, 1, 1, 1, 5, 2, 20, 2, 1, 1, 2, 2, 1, 4, 2, 2, 2, 
5, 2, 1, 2, 2, 2, 0, 3, 5, 1, 1, 0, 2, 10, 10, 1, 2, 2, 2, 3, 
2, 5, 2, 5, 5, 2, 5, 10, 2, 2, 2, 2, 2, 4, 2, 5, 2, 5, 2, 0, 
2, 2, 10, 2, 2, 2, 30, 1, 20, 10, 2, 1, 1, 10, 2, 2, 2, 2, 5, 
1, 2, 5, 1, 2, 1, 2, 10, 5, 2, 5, 5, 2, 5, 5, 2, 5, 5, 10, 1, 
5, 2, 2, 2, 2, 1, 10, 2, 5, 5, 2, 1, 2, 4, 2, 2, 10, 5, 2, 1, 
2, 1, 5, 2, 10, 2, 2, 10, 10, 10, 5, 2, 10, 20, 3, 3, 2, 2, 5, 
10, 3, 2, 5, 4, 10, 3, 3, 5, 10, 5, 5, 3, 2, 5, 10, 5, 5, 5, 
5, 3, 5, 5, 4, 2, 3, 3, 10, 2, 3, 5, 5, 4, 5, 5, 5, 5, 5, 10, 
3, 2, 2, 4, 2, 5, 2, 5, 5, 2, 10, 2, 2, 5, 3, 2, 2, 5, 5, 2, 
2, 10, 5, 5, 3, 2, 3, 15, 10, 5, 2, 2, 5, 10, 10, 5, 5, 2, 2, 
2, 10, 2, 2, 2, 2, 5, 4, 4, 4, 5, 5, 2, 2, 4, 1, 5, 5, 5, 3, 
5, 2, 10, 4, 5, 2, 2, 5, 5, 4, 2, 5, 2, 3, 2, 3, 2, 2, 5, 2, 
10, 5, 4, 4, 2, 5, 3, 4, 4, 3, 2, 5, 2, 10, 5, 15, 2, 3, 5, 3, 
4, 10, 4, 3, 5, 3, 2, 2, 3, 3, 5, 2, 5, 2, 5, 5, 2, 4, 2, 5, 
2, 3, 5, 5, 2, 3, 5, 4, 3, 2, 4, 3, 3, 4, 4, 4, 2, 5, 3, 2, 2, 
3, 5, 3, 5, 3, 4, 5, 2, 5, 3, 3, 3, 4, 3, 4, 5, 5, 5, 2, 3, 4, 
3, 5, 3, 5, 3, 3, 2, 5, 4, 3, 10, 5, 5, 5, 2, 4, 10, 3, 2, 3, 
3, 4, 5, 5, 4, 3, 3, 5, 5, 5, 3, 2, 3, 4, 3, 2, 8, 3, 3, 5, 4, 
2, 5, 4, 3, 4, 5, 4, 3, 5, 3, 5, 8, 5, 2, 2, 3, 5, 3, 2, 4, 3, 
1, 5, 2, 3, 3, 3, 5, 2, 3, 2, 5, 4, 5, 3, 5, 2, 4, 5, 2, 4, 4, 
4, 3, 3, 6, 3, 8, 3, 4, 3, 7, 2, 2, 5, 10, 4, 8, 4, 7, 10, 1, 
1, 7, 2, 1, 3, 7, 7, 3, 8, 1, 3, 5, 1, 3, 15, 7, 1, 5, 4, 2, 
14, 6, 9, 12, 1, 15, 4, 1, 2, 2, 4, 1, 1, 8, 3, 4, 2, 18, 2, 
3, 5, 1, 10, 2, 10, 2, 4, 2, 2, 1, 2, 5, 3, 5, 10, 4, 5, 1, 8, 
2, 5, 9, 4, 7, 4, 7, 4, 2, 1, 10, 3, 3, 4, 1, 8, 4, 1, 2, 1, 
8, 2, 4, 2, 6, 5, 1, 6, 1, 15, 3, 1, 3, 4, 9, 2, 12, 1, 1, 2, 
1, 7, 6, 9, 2, 3, 6, 1, 2, 2, 2, 1, 1, 3, 4, 2, 4, 1, 4, 3, 3, 
3, 8, 1, 7, 4, 1, 2, 1, 2, 12, 2, 2, 7, 2, 3, 2, 2, 4, 5, 6, 
3, 11, 4, 1, 3, 3, 13, 4, 2, 4, 1, 6, 7, 11, 6, 2, 6, 4, 2, 2, 
1, 10, 4, 1, 1, 2, 6, 2, 3, 8, 8, 7, 3, 3, 3, 2, 14, 2, 3, 2, 
8, 1, 10, 1, 2, 11, 3, 3, 2, 1, 2, 1, 10, 1, 3, 4, 4, 3, 10, 
5, 3, 6, 7, 3, 10, 1, 15, 3, 4, 4, 1, 1, 8, 1, 3, 40, 3, 12, 
4, 1, 5, 1, 7, 7, 4, 4, 9, 7, 7, 8, 3, 3, 8, 8, 3, 5, 2, 2, 2, 
5, 4, 2, 2, 4, 5, 10, 3, 3, 4, 3, 4, 2, 8, 1, 4, 2, 3, 3, 2, 
3, 2, 1, 10, 6, 10, 5, 4, 6, 3, 6, 10, 4, 8, 8, 8, 8, 4, 3, 4, 
4, 6, 10, 4, 5, 2, 15, 12, 5, 4, 3, 10, 15, 3, 3, 8, 2, 4, 10, 
5, 5, 10, 2, 5, 10, 10, 6, 8, 6, 4, 8, 3, 4, 2, 8, 10, 30, 10, 
2, 3, 1, 1, 1, 1, 1, 4, 3, 2, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 5, 
2, 1, 1, 1, 4, 60, 2, 3, 5, 3, 2, 1, 2, 2, 3, 2, 5, 0, 0, 1, 
3, 3, 2, 3, 2, 0, 4, 1, 3, 40, 1, 2, 2, 3, 2, 3, 1, 2, 2, 0, 
2, 2, 1, 10, 1, 9, 1, 2, 3, 7, 3, 10, 1, 3, 2, 3, 5, 3, 5, 1, 
10, 1, 2, 3, 2, 3, 2, 10, 2, 2, 1, 3, 2, 6, 1, 2, 1, 5, 2, 1, 
1, 2, 3, 3, 4, 3, 2, 3, 5, 7, 1, 10, 2, 2, 3, 2, 1, 2, 2, 2, 
1, 1, 2, 2, 2, 4, 2, 2, 2, 4, 0, 6, 1, 1, 2, 2, 1, 2, 1, 2, 5, 
1, 2, 2, 2, 1, 3, 1, 1, 5, 10, 1, 2, 3, 5, 3, 2, 2, 1, 1, 1, 
2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 3, 1, 3, 5, 1, 3, 3, 20, 2, 
2, 2, 4, 0, 3, 1, 1, 2, 1, 3, 2, 4, 1, 0, 2, 2, 6, 2, 2, 2, 4, 
2, 2, 2, 2, 2, 1, 1, 2, 1, 3, 2, 1, 3, 1, 1, 5, 4, 8, 3, 20, 
1, 3, 2, 2, 1, 4, 1, 1, 1, 2, 5, 2, 5, 5, 3, 3, 2, 2, 1, 1, 1, 
3, 3, 2, 0, 2, 2, 2, 1, 2, 1, 5, 6, 1, 2, 1, 3, 1, 5, 2, 2, 1, 
0, 2, 1, 0, 1, 0, 0, 0, 1, 3, 2, 2, 5, 5, 0, 0, 0, 3, 0, 8, 5, 
3, 3, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 2, 2, 
0, 1, 0, 0, 0, 0, 0, 0, 2, 2, 1, 1, 1, 2, 1, 5, 4, 1, 1, 3, 1, 
1, 1, 0, 0, 0, 1, 3, 0, 1, 30, 0, 0, 0, 1, 0, 1, 7, 0, 5, 0, 
1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 2, 
3, 1, 1, 1, 0, 3, 3, 2, 1, 2, 2, 3, 1, 3, 1, 3, 5, 1, 1, 4, 1, 
4, 1, 1, 1, 1, 3, 1, 1, 3, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 2, 
1, 1, 2, 1, 1, 1, 1, 1, 3, 1, 1, 1, 4, 1, 3, 2, 1, 2, 1, 1, 1, 
1, 1, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4.8, 1.5, 6.4, 
0.5, 3.6, 3.4, 3.8, 9.3, 11.6, 1.5, 0.5, 1, 18.5, 6.3, 4.4, 0.5, 
0.5, 0.5, 3.5, 3.1, 0.5, 9.7, 2.8, 0.5, 1, 7.5, 3.1, 5.1, 2.2, 
4.4, 4, 4.5, 9.5, 31.5, 4.1, 0.5, 1, 1.3, 3.5, 3.2, 14.1, 3.1, 
7.1, 30, 5, 1.5, 3, 1.2, 2.8, 5.7, 4, 8.2, 9.7, 2.7, 20, 1.9, 
25, 5.1, 5.7, 11.8, 3, 40, 3, 15, 28.2, 5, 2.6, 7.1, 3.7, 9, 
6, 9.5, 1, 1, 1, 5.5, 1, 3.9, 4.3, 3, 2.4, 3.5, 3.1, 2.4, 2, 
2.2, 11.1, 2.7, 15.9, 13.5, 6.4, 3.6, 16.5, 2.8, 3.3, 32.7, 3.3, 
29.6, 6.1, 3.9, 5, 8.2, 1, 11.9, 25, 17.9, 12.9, 20)
cmirian
  • 2,572
  • 3
  • 19
  • 59

1 Answers1

2

We can convert to numeric

as.numeric(as.character(df$x))
#[1]  2.8  9.0  0.5  1.2  4.0 12.0

Can have more control with sprintf

sprintf("%0.2f", as.numeric(as.character(df$x)))

Or with grep and paste

ifelse(grepl(".", df$x, fixed = TRUE), as.character(df$x), paste0(df$x, ".0"))
#[1] "2.8"  "9.0"  "0.5"  "1.2"  "4.0"  "12.0"
akrun
  • 874,273
  • 37
  • 540
  • 662
  • I just edited my post as it didn't do with `ee$x <- as.numeric(as.character(ee$x))`. I will try your other options right away - I didnt see them before editing. – cmirian Mar 15 '20 at 21:13
  • 1
    I think it should be "%0.1f" – ThomasIsCoding Mar 15 '20 at 21:13
  • 1
    @cmirian the `ee$x` is already numeric, while your `df$x` is `factor` – akrun Mar 15 '20 at 21:13
  • 1
    @cmirian what would be the expected output class? If it is character, then `ifelse(grepl(".", ee$x, fixed = TRUE), ee$x, paste0(ee$x, ".0"))` – akrun Mar 15 '20 at 21:15
  • Thank you both for helping me. `ee$x <- sprintf("%0.1f", as.numeric(as.character(ee$x)))` did exactly what I sought – cmirian Mar 15 '20 at 21:18
  • Hi @akrun. Thank you for your help - I've been thinking about what you wrote. How is it that `ee$x` and `df$x` are different? I do not get why `df$x` is a `factor` when it contain same types of integers and decimals as `ee$x`. Perhaps my confusion centers at what the differences between `factor` and `numeric`, given the posted example, are. Please, could you briefly elaborate? As you figured out, I am quite new but eager to learn. – cmirian Mar 16 '20 at 09:31
  • 1
    @cmirian `df$x` is factor because quoted values while construcitng the data.frame, and by default `stringsAsFactors = TRUE` in `data.frame – akrun Mar 16 '20 at 18:23