How to lappy() over selective columns? - R

时间:2017-04-10 03:04:58

标签: r lapply

I am a novice R programmer. I am wondering how to lappy over a dataframe but avoiding certain columns.

# Some dummy dataframe
df <- data.frame(
         grp = c("A", "B", "C", "D"),
         trial = as.factor(c(1,1,2,2)),
         mean = as.factor(c(44,33,22,11)),
         sd = as.factor(c(3,4,1,.5)))

df <- lapply(df, function (x) {as.numeric(as.character(x))})

However, the method I used introduces NAs by coercion.

Would there to selectively (or deselectively) lapply over the dataframe while maintaining the integrity of the dataframe?

In other words, would there be a way to convert only mean and sd to numerics? (In general form)

Thank you

3 个答案:

答案 0 :(得分:2)

Try doing this:

df[,3:4] <- lapply(df[,3:4], function (x) {as.numeric(as.character(x))})

You are simply passing function to the specified columns. You can also provide a condition to select subset of your columns, something like excluding the ones you don't want to cast.

col = names(df)[names(df)!=c("grp","trial")]
df[,col] <- lapply(df[,col], function (x) {as.numeric(as.character(x))})

答案 1 :(得分:1)

Well as you might have guessed, there are many ways. Since you seem to be doing in place substitution, actually, a for loop would be suitable.

df <- data.frame(
         grp = c("A", "B", "C", "D"),
         trial = as.factor(c(1,1,2,2)),
         mean = as.factor(c(44,33,22,11)),
         sd = as.factor(c(3,4,1,.5)))

my_cols <- c("trial", "mean", "sd")
for(mc in my_cols) {
    df[[mc]] <- as.numeric(as.character(df[[mc]]))
}

答案 2 :(得分:1)

If you want to convert selectively by column names:

library(dplyr)
df %>% 
  mutate_if(names(.) %in% c("mean", "sd"), 
            function(x) as.numeric(as.character(x)))