使用rbind向DataFrame添加行时salary被转为chr类型的问题
问题原因
你遇到的类型转换问题,根源出在创建新行的方式上:
当你用c()函数混合数值(id=11、salary=53000)和字符串(dept="Human Resources")创建new_emp时,R会自动将整个向量统一为字符类型——因为向量只能容纳同一种数据类型。后续用rbind()合并时,原数据框的所有列会被强制转换成和新向量一致的字符类型,这就导致原本的数值型salary和整数型id都变成了字符型。
解决方案
有两种简单的方法可以避免这个问题:
方法1:将新行创建为数据框
直接用data.frame()创建新行,保证数据类型和原数据框匹配:
id = 1:10 dept = c("Engineering", "Operations", "Compliance", "Engineering","Operations", "Operations", "Compliance", "Sales", "HR", "HR" ) name = c("Stephen", "Mary", "Frank", "Nick", "Joseph", "Felicity", "Jim", "Rachel", "Fiona", "Jack") salary = c(50000,100000,25000,40000,80000, 70000, 60000, 125000, 105000, 200000) emp <- data.frame(id, dept, name, salary, stringsAsFactors=FALSE) # 把新行创建为数据框 new_emp <- data.frame(id=11, dept="Human Resources", name="Jeremy", salary=53000, stringsAsFactors=FALSE) emp <- rbind(emp, new_emp) str(emp)
执行后str(emp)会显示各列类型保持正确:
'data.frame': 11 obs. of 4 variables: $ id : int 1 2 3 4 5 6 7 8 9 10 11 $ dept : chr "Engineering" "Operations" "Compliance" "Engineering" ... $ name : chr "Stephen" "Mary" "Frank" "Nick" ... $ salary: num 50000 100000 25000 40000 80000 ...
方法2:使用dplyr包的add_row函数
如果你习惯用tidyverse工具,dplyr::add_row()会自动匹配原数据框的列类型,写法更简洁:
library(dplyr) id = 1:10 dept = c("Engineering", "Operations", "Compliance", "Engineering","Operations", "Operations", "Compliance", "Sales", "HR", "HR" ) name = c("Stephen", "Mary", "Frank", "Nick", "Joseph", "Felicity", "Jim", "Rachel", "Fiona", "Jack") salary = c(50000,100000,25000,40000,80000, 70000, 60000, 125000, 105000, 200000) emp <- data.frame(id, dept, name, salary, stringsAsFactors=FALSE) # 直接添加新行 emp <- emp %>% add_row(id=11, dept="Human Resources", name="Jeremy", salary=53000) str(emp)
这个方法不需要手动维护新行的数据类型,更不容易出错。
内容的提问来源于stack exchange,提问作者smackenzie
相关产品推荐
相关产品推荐

