R 在数据帧中赋值时,因子变为整数
我有两个数据帧:R 在数据帧中赋值时,因子变为整数,r,dataframe,R,Dataframe,我有两个数据帧: employee <- c("John Doe","Peter Gynn","Jolie Hope") salary <- c(21000, 23400, 26800) startdate <- as.Date(c('2010-11-1','2008-3-25','2007-3-14')) data1 <- data.frame(employee, salary, startdate) employee <- c("John Doe", "Rob
employee <- c("John Doe","Peter Gynn","Jolie Hope")
salary <- c(21000, 23400, 26800)
startdate <- as.Date(c('2010-11-1','2008-3-25','2007-3-14'))
data1 <- data.frame(employee, salary, startdate)
employee <- c("John Doe", "Rob", "Peter Gynn", "Ellen A")
city <- c("city1", "city2", "city3", "city1")
age <- c( 1,3,4,2)
data2 <- data.frame(employee, city, age)
有人能解释一下为什么因子会变成整数,以及为什么下面的方法有效吗
data1[, c("city", "age")] <- data2[1:3, c("city", "age")]
> data1
employee salary startdate city age
1 John Doe 21000 2010-11-01 city1 1
2 Peter Gynn 23400 2008-03-25 city2 3
3 Jolie Hope 26800 2007-03-14 city3 4
data1[,c(“城市”、“年龄”)]data1
员工工资起始日期城市年龄
约翰·多伊21000 2010-11-01城市1 1
2彼得·吉恩23400 2008-03-25城市2 3
3朱莉希望26800 2007-03-14城市3 4
有没有办法避免这种情况?我希望避免使用(绑定函数)。如果我们需要从“data2”列在“data1”中创建两个变量,我们可以直接创建它,而不是创建新变量作为
NA
,然后用“data2”中相应的列替换这些值。(我没有为行索引指定1:3,因为data1的nrow
是3)
两个数据集中“城市”的类
class(data1$city)
#[1] "logical"
class(data2$city)
#[1] "factor"
因此,这可能导致将factor
类强制为numeric
,因为factor
的存储模式为numeric
mode(data2$city)
#[1] "numeric"
如果我们想先在“data1”中创建变量,然后替换,一个选项是将变量“city”创建为因子
,并在城市
中将级别作为唯一元素
data1$city <- factor(NA, levels=unique(city))
data1[, c("city", "age")] <- data2[1:3, c("city", "age")]
data1$city
#[1] city1 city2 city3
#Levels: city1 city2 city3
data1$city最好使用character
类而不是factor
,这可以通过使用read.table/read.csv
或data.frame
调用中的stringsafactors=FALSE
选项来实现。因子级别存储为整数,因此有可能被强制为integer类。我知道使用字符代替因子可以避免这个问题,但我希望保留原始列类,避免出现上述情况。data1$city
的类与data2$city
的类不同,谢谢@akrun的澄清。我首先需要在“data1”中创建新列,因为我不一定用“data2”中的数据填充整个列。因此,“data1$city”可能包含“NA”。第二个解决方案是为data1新列定义类。
data1$city <- NA
data1$age <- NA
class(data1$city)
#[1] "logical"
class(data2$city)
#[1] "factor"
mode(data2$city)
#[1] "numeric"
data1$city <- factor(NA, levels=unique(city))
data1[, c("city", "age")] <- data2[1:3, c("city", "age")]
data1$city
#[1] city1 city2 city3
#Levels: city1 city2 city3