Skip to content

Loop over columns of dataframe and change values condtionally

3 messages · Luigi Marongiu, PIKAL Petr, Rui Barradas

#
Hello,
it is possible to select the columns of a dataframe in sequence with:
```
for(i in 1:ncol(df)) {
  df[ , i]
}
# or
for(i in 1:ncol(df)) {
  df[ i]
}
```
And change all values with, for instance:
```
for(i in 1:ncol(df)) {
  df[ , i] <- df[ , i] + 10
}
```
Is it possible to apply a condition? What would be the syntax?
For instance, to change all 0s in a column to NA would `df[i][df[i ==
0] = NA` be right?
Thank you
#
Hi

you could operate with whole data frame (sometimes)
head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

chenge all
Sepal.Length Sepal.Width Petal.Length Petal.Width
1         15.1        13.5         11.4        10.2
2         14.9        13.0         11.4        10.2
3         14.7        13.2         11.3        10.2
4         14.6        13.1         11.5        10.2
5         15.0        13.6         11.4        10.2
6         15.4        13.9         11.7        10.4

change only some
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5         11.4        10.2  setosa
2          4.9         3.0         11.4        10.2  setosa
3          4.7         3.2         11.3        10.2  setosa
4          4.6         3.1         11.5        10.2  setosa
5          5.0         3.6         11.4        10.2  setosa
6          5.4         3.9         11.7        10.4  setosa


Cheers
Petr
NA`
#
Hello,

In the particular case you have, to change to NA based on condition, use 
`is.na<-`.

Here is some test data, 3 times the same df.


set.seed(2021)
df3 <- df2 <- df1 <- data.frame(
   x = c(0, 0, 1, 2, 3),
   y = c(1, 2, 3, 0, 0),
   z = rbinom(5, 1, prob = c(0.25, 0.75)),
   a = letters[1:5]
)


# change all columns
is.na(df1) <- df1 == 0
df1

# only one column
is.na(df2[, 2]) <- df2[, 2] == 0
df2

# change several columns given by an index
is.na(df3[c(1, 3)]) <- df3[c(1, 3)] == 0
df3


Hope this helps,

Rui Barradas


?s 14:35 de 02/09/21, Luigi Marongiu escreveu: