将选择列从字符更改为整数

时间:2017-03-30 18:49:08

标签: r dplyr

我有一个数据框:

sample = data.frame(
  beer_brewerId = c("8481", "8481", "8481"),
  rev_app = c("4/5","1/5", "2/5"),
  beer_name = c("John Harvards Simcoe IPA", "John Harvards Simcoe IPA", "John Harvards American Brown Ale"),
  review_taste =c("6/10", "7/10", "6/10"), stringsAsFactors = FALSE
)
str(sample)

我想将字符向量中的第2列和第4列转换为整数以进行分析。通常情况下,如果我想要使用以下代码将所有字符列转换为数字,这不会那么困难,但这不起作用,因为我希望将第3列保留为chr类型:

sample %>%
  select(2,4) %>%
  mutate_if(is.character, as.numeric)

您可以使用base r轻松完成此操作:

#base approach
cols <- c("2","4")
data[cols] <- lapply(data[cols], as.numeric)

是否有一种简单的方法可以使用dplyr,甚至在管道序列中执行此操作?如果您只使用select()选择某些列,则不允许您将结果保存回数据框

这样的东西可行,但由于我的数据集有15列以上,这似乎是非常麻烦的代码:

cleandf <- sample %>%
#Use transform or mutate to convert each column manually
transform(rev_app = as.integer(rev_app)) %>%
transform(review_taste = as.integer(review_taste))

mutate_atmutate_each是否意味着执行此任务?任何帮助,将不胜感激。感谢。

#Maybe something like this:
cols <- c("2","4")
data %>%
  mutate_each(is.character[cols], as.numeric)

2 个答案:

答案 0 :(得分:2)

您可以使用mutate_at功能实现此目的。

sample = data.frame(beer_brewerId = c("8481", "8481", "8481"),
     rev_app = c("4/5","1/5", "2/5"),
     beer_name = c("John Harvards Simcoe IPA", "John Harvards Simcoe IPA", "John Harvards American Brown Ale"),
     review_taste =c("6/10", "7/10", "6/10"), stringsAsFactors = FALSE)

# get rid of "/"
clean <- function(foo) {
         sapply(foo, function(x) eval(parse(text = x)))
         }
# you can replace c(2,4) by whatever columns you need
clean_sample <- sample %>% 
                mutate_at(c(2,4), clean)

第2列和第4列现在是数字。

答案 1 :(得分:1)

最简单的方法是使用带有指定列索引的mutate_at:

st