2015-08-20 2 views
0

У меня есть этот фрейм данных, и я хочу умножить все его числовые значения на 100. Если использовать этот код df*100 Я получаю NA для всех записей в столбце страны.Умножение только числовых значений фрейма данных

Каков наилучший способ умножения кадра данных без замены NA на названия стран?

      country gdp.stdv con.stdv[, 2] inv.stdv[, 2] gov.stdv[, 2] 
1      Australia 0.01317959 0.010973106 0.03932870 0.016814514 
2      Austria 0..011640438 0.03281213 0.008398618 
3       Canada 0.01357573 0.011042443 0.03991174 0.014100187 
4 European Union (15 countries) 0.01073943 0.007744634 0.02606627 0.005658542 

ответ

1

Во-первых, определить столбцы, которые являются числовыми, а затем запустить эти столбцы через lapply.

numeric_cols <- vapply(df, is.numeric, logical(1)) 
df[, numeric_cols] <- lapply(df[, numeric_cols, drop = FALSE], 
          function(x) x * 100) 
1

Вы можете использовать sapply, чтобы определить числовые столбцы, а затем умножить те времена 100

set.seed(321) 
dat <- data.frame(country = c("Australia", "Austria", "Canada", "European"), 
       x1 = rnorm(4), 
       x2 = rnorm(4), 
       x3 = rnorm(4)) 
dat 
    country   x1   x2   x3 
1 Australia 1.7049032 -0.1239606 0.3391139 
2 Austria -0.7120386 0.2681838 -0.5519147 
3 Canada -0.2779849 0.7268415 0.3477014 
4 European -0.1196490 0.2331354 1.4845918 

cols <- sapply(dat, is.numeric) 
dat[, cols] <- dat[, cols] * 100 
dat 

    country  x1  x2  x3 
1 Australia 170.49032 -12.39606 33.91139 
2 Austria -71.20386 26.81838 -55.19147 
3 Canada -27.79849 72.68415 34.77014 
4 European -11.96490 23.31354 148.45918 
1

Если это только в первой колонке вы могли бы сделать что-то вроде:

cbind(df[1],(df[-1]*100)) 
1

Вы также может использовать функцию mutate_each_ в пакете dplyr, чтобы сделать то же самое. Сначала определим функцию

times100 <- function(x){x * 100} 

тогда

mutate_each_(df, funs(times100), names(which(sapply(df, is.numeric)))) 

который применяет функцию для всех столбцов, оцененных names(which(sapply(df, is.numeric)))

Смежные вопросы