将系数/?标称变量转换为R中的数值
我的问题似乎与你有关 然而,这里给出的方法对我不起作用 我将数据集中的向量定义为:将系数/?标称变量转换为R中的数值,r,variables,type-conversion,numeric,R,Variables,Type Conversion,Numeric,我的问题似乎与你有关 然而,这里给出的方法对我不起作用 我将数据集中的向量定义为:eduyears1994您可以试试 c(17,8,4)[as.numeric(eduyears1994)] #[1] 17 4 17 4 17 17 4 4 17 17 17 17 4 8 4 4 8 4 8 8 或 如果8实际上是一个typo,您可以使用 library(stringi) as.numeric(unlist(stri_extract_all_regex(eduyear
eduyears1994您可以试试
c(17,8,4)[as.numeric(eduyears1994)]
#[1] 17 4 17 4 17 17 4 4 17 17 17 17 4 8 4 4 8 4 8 8
或
如果8
实际上是一个typo
,您可以使用
library(stringi)
as.numeric(unlist(stri_extract_all_regex(eduyears1994, '^\\d+')))
#[1] 17 4 17 4 17 17 4 4 17 17 17 17 4 2 4 4 2 4 2 2
数据
set.seed(21)
教育年1994你可以试试
c(17,8,4)[as.numeric(eduyears1994)]
#[1] 17 4 17 4 17 17 4 4 17 17 17 17 4 8 4 4 8 4 8 8
或
如果8
实际上是一个typo
,您可以使用
library(stringi)
as.numeric(unlist(stri_extract_all_regex(eduyears1994, '^\\d+')))
#[1] 17 4 17 4 17 17 4 4 17 17 17 17 4 2 4 4 2 4 2 2
数据
set.seed(21)
eduyears1994使用@akrun的例子:
set.seed(21)
eduyears1994 <- factor(sample(c('4 lata/1', 2, '17 lat'), 20, replace=TRUE))
警告:这会将“2”转换为2,而不是8,这不是您所要求的。我不太确定你用什么逻辑把“4lata/1”转换成4,“17lat”转换成17,“2”转换成8——也许你能解释一下?可能是打字错误?使用@akrun的示例:
set.seed(21)
eduyears1994 <- factor(sample(c('4 lata/1', 2, '17 lat'), 20, replace=TRUE))
警告:这会将“2”转换为2,而不是8,这不是您所要求的。我不太确定你用什么逻辑把“4lata/1”转换成4,“17lat”转换成17,“2”转换成8——也许你能解释一下?可能是打字错误?使用您的实际数据,您似乎有一个通用格式的字符向量
n lat/a,b
其中n
是年份,“a,b”是某种标签。这将节省时间
vec <- c("17 lat/9","10 lat/3,4","10 lat/3,4","17 lat/9","17 lat/9","12 lat/5,6","10 lat/3,4","10 lat/3,4","12 lat/5,6")
x <- strsplit(vec,split=" lat/",fixed=TRUE)
sapply(x,function(x)as.integer(x[1]))
# [1] 17 10 10 17 17 12 10 10 12
vec使用实际数据,您似乎有一个通用格式的字符向量
n lat/a,b
其中n
是年份,“a,b”是某种标签。这将节省时间
vec <- c("17 lat/9","10 lat/3,4","10 lat/3,4","17 lat/9","17 lat/9","12 lat/5,6","10 lat/3,4","10 lat/3,4","12 lat/5,6")
x <- strsplit(vec,split=" lat/",fixed=TRUE)
sapply(x,function(x)as.integer(x[1]))
# [1] 17 10 10 17 17 12 10 10 12
vec不清楚为什么您要将'2'
更改为8
,而在其他情况下,即使用lat
,则选择前缀号。您是否测试了我的解决方案?我正在检查标签2是否将转换为它所代表的内容,也就是说,8年了,因为我不确定我收到的错误消息是否是因为R看到的是标签,而不是文本@请在您的帖子下面对您的解决方案发表更多评论谢谢,我知道了。您收到的错误消息是因为您的向量是因子
,并且您正试图分配一个值
或因子没有的级别。我会在分配之前将其转换为字符类,即教育年1994谢谢!似乎:教育年1994不清楚为什么您要将'2'
更改为8
,而在其他情况下,即使用lat
,前缀号被选中。您测试过我的解决方案吗?我正在检查标签2是否会转换为它所代表的内容,也就是说,8年了,因为我不确定我收到的错误消息是否是因为R看到的是标签,而不是文本@请在您的帖子下面对您的解决方案发表更多评论谢谢,我知道了。您收到的错误消息是因为您的向量是因子
,并且您正试图分配一个值
或因子没有的级别。我会在分配之前将其转换为字符类,即教育年1994谢谢!似乎:eduyears1994我认为这与OP的手册代码eduyears1994[eduyears1994==“2”]相矛盾,我选择关注提供的样本数据集,而不是制作一个。在该示例中,没有“4 lat/1”等。如果该示例不具有代表性,则此答案可能不适用于OP。我还考虑使用提供的数据集,直到我在strsplit中看到他的codeError(eduyears1994,split=“lat/”,fixed=TRUE):非字符argument@Asiackstrsplit
需要字符
向量。尝试strsplit(as.character(eduyears1994),…
我认为这与OP的手动代码eduyears1994[eduyears1994==“2”]相矛盾。我选择关注提供的样本数据集,而不是构建一个。在该样本中,没有“4 lat/1”,等等。如果样本不具有代表性,那么这个答案可能不适用于OP。我还考虑使用提供的数据集,直到我在strsplit中看到他的codeError(eduyears1994,split=“lat/”,fixed=TRUE):非字符argument@Asiackstrsplit
需要character
vector。请尝试strsplit(as.character(1994年教育年鉴),…
我正在检查标签2是否会转换为它所代表的内容,即8年。gsub产生以下结果:>作为数值(gsub(“lata*/*[0-9,]*”,“”,1994年教育年鉴))[1]17 NA 17 17 12 NA 12 14 NA 17 12 NA 12 12 17 NA 12 12 17 NA 12 12 17[34]17 17 12 12 14 12 8 NA 12 8 17 NA 12 NA 17 8 NA 12 12 17 NA 14 NA 14 NA 12 NA 17 12我很惊讶你得到了所有这些NA
值——在我的例子中,所有的东西都被转换了。你能展示dput(教育年1994)
的结果吗?你能解释一下为什么会有“2”这样的标签吗(由于我不理解的原因,这相当于8年)混合了文本标签,如“17 lat”?抱歉延迟。我认为数据被指定为标称而不是数字,R以一种奇怪的方式读取。dput(eduyears1994)的结果,其中eduyears1994有9个级别,或者我称之为“标签”:无教育/0,4年/1,8年/2,10年/3,4(我想这取决于小学前8年后额外的2年来自哪里),12年/5,6,14年/7,8我正在检查标签2是否会转换为它所代表的,即8年。gsub产生以下结果:>as.numeric(gsub(“lata*/*[0-9,]*”,“”,eduyears1994))[1]17 NA 17 17 12 NA 12 14 NA NA 17 12 12 17 NA 12 12 12 17 NA 14 17 NA 12 12 12 17[34]17 17 12 12 14 12 8 NA 12 8 17 NA 12 NA 17 8 NA 12 12 17 NA 14 NA 14 NA 12 NA 17 12我很惊讶你得到了所有这些NA
值——在我的例子中,所有的东西都被转换了。你能展示dput(教育年1994)
的结果吗?你能解释一下为什么会有“2”这样的标签吗(由于我不理解的原因,这相当于8年)混合了文本标签,如“17 lat”?很抱歉延迟。我认为数据被指定为标称值,而不是数字,R读取它I
vec <- c("17 lat/9","10 lat/3,4","10 lat/3,4","17 lat/9","17 lat/9","12 lat/5,6","10 lat/3,4","10 lat/3,4","12 lat/5,6")
x <- strsplit(vec,split=" lat/",fixed=TRUE)
sapply(x,function(x)as.integer(x[1]))
# [1] 17 10 10 17 17 12 10 10 12