如何将tibble转换为data frame并生成Iphone占比列?
R语言处理tibble转data.frame及新增占比列问题
一、一步完成所有操作(推荐)
直接在你现有的tidyverse管道后追加代码,一次性搞定占比计算、列移除和格式转换:
library(tidyverse) my_df <- pivot_longer(df_apple, -c(Macbook, type), names_to = "Year") %>% pivot_wider(names_from = "type", values_from = "value") %>% separate(Macbook, c("code", "name")) %>% # 计算Iphone占比——两种情况二选一: # 1. 每行自身的Iphone/(Iphone+Ipad) mutate(Iphone_percentage = Iphone / (Iphone + Ipad)) %>% # 2. 按年份汇总的总Iphone占比(该年份所有行共用这个比例) # group_by(year) %>% # mutate(total_iphone = sum(Iphone), total_ipad = sum(Ipad)) %>% # mutate(Iphone_percentage = total_iphone / (total_iphone + total_ipad)) %>% # ungroup() %>% # select(-total_iphone, -total_ipad) %>% # 删除原有的Iphone和Ipad列 select(-Iphone, -Ipad) %>% # 转成data.frame,指定不把字符串转成因子 as.data.frame(stringsAsFactors = FALSE)
二、单独解决转data.frame失败的问题
如果as.data.frame()没成功,大概率是默认把字符串转成因子导致的,或者你的tibble里有列表列:
- 用
data.frame()强制转换,明确关闭因子转换:my_df <- data.frame(my_tibble, stringsAsFactors = FALSE) - 如果有列表列,先使用
unnest()把列表展开成常规列,再转换。
三、验证结果
转完后可以用以下代码确认:
# 检查是否是data.frame类型 class(my_df) # 查看前几行数据 head(my_df)
内容的提问来源于stack exchange,提问作者Joseph Carthof
相关产品推荐
相关产品推荐

