我有一个数据框:
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_at
或mutate_each
是否意味着执行此任务?任何帮助,将不胜感激。感谢。
#Maybe something like this:
cols <- c("2","4")
data %>%
mutate_each(is.character[cols], as.numeric)
答案 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