组合成不同长度但保留顺序的数据帧向量
combine into a data frame vectors of different length but preserving the order
我有一个字符向量,其形式如下:
vv<-c(1,2,"c", "2%", 3, "b", "4%") # original vector
我根据以下代码行从这个向量创建了一些新向量:
# original vector
vv<-c(1,2,"c", "2%", 3, "b", "4%")
# vector without the characters , i.e the c and b
vv1<-vv[-grep("[a-zA-Z]", vv)]
# Steps to create the vector of "integers"
strip_percents <- as.numeric(gsub("%", "", vv1))
no_percents <- as.numeric(vv1[-grep("%", vv1)])
# Vector that collects the strings
strings_vv1 <- vv[grep("[a-zA-Z]", vv)]
# Vector the collects the percentage numbers
perce_vv1 <-vv1[grep("%", vv1)]
perce_vv1 <- as.numeric(gsub("%", "", perce_vv1))/100
我的目的是组合所有这些向量并创建一个数据框,但 位于原始向量的 structure/order 之后。换句话说,我想用 "right place" 中的 NA 填充数据框。因此,例如,我希望我的数据框看起来像这样:
df<-data.frame(original=vv, numerics=c(1,2,NA,0.02,3,NA,0.04), integers=c(1,2,NA,NA,3,NA,NA), characters=c(NA,NA,"c",NA,NA,"b",NA))
original numerics integers characters
1 1 1.00 1 <NA>
2 2 2.00 2 <NA>
3 c NA NA c
4 2% 0.02 NA <NA>
5 3 3.00 3 <NA>
6 b NA NA b
7 4% 0.04 NA <NA>
有人可以帮我完成这个任务吗?
我们可以为 %
('i1') 的元素创建一个数字索引,然后用 /100
替换那些 %
的元素,评估字符串并分配输出背部。对更改后的向量 ('vv1') 应用 as.numeric
将导致所有非数字都为 NA,类似地,我们可以对原始向量 ('vv') 执行 as.integer
并获得所有非数字到 NA。带字母的元素可以用grepl
标识,用ifelse
将所有其他元素转换为NA。
vv1 <- vv
i1 <- grep("%", vv)
library(gsubfn)
vv1[i1] <- sapply(gsubfn(".", list(`%`="/100"), vv[i1]), function(x) eval(parse(text=x)))
vv1 <- as.numeric(vv1)
vv2 <- as.integer(vv)
vv3 <- ifelse(grepl("^[A-Za-z]+$", vv), vv, NA)
data.frame(original=vv, numerics=vv1, integer=vv2, characters=vv3)
# original numerics integer characters
#1 1 1.00 1 <NA>
#2 2 2.00 2 <NA>
#3 c NA NA c
#4 2% 0.02 NA <NA>
#5 3 3.00 3 <NA>
#6 b NA NA b
#7 4% 0.04 NA <NA>
我有一个字符向量,其形式如下:
vv<-c(1,2,"c", "2%", 3, "b", "4%") # original vector
我根据以下代码行从这个向量创建了一些新向量:
# original vector
vv<-c(1,2,"c", "2%", 3, "b", "4%")
# vector without the characters , i.e the c and b
vv1<-vv[-grep("[a-zA-Z]", vv)]
# Steps to create the vector of "integers"
strip_percents <- as.numeric(gsub("%", "", vv1))
no_percents <- as.numeric(vv1[-grep("%", vv1)])
# Vector that collects the strings
strings_vv1 <- vv[grep("[a-zA-Z]", vv)]
# Vector the collects the percentage numbers
perce_vv1 <-vv1[grep("%", vv1)]
perce_vv1 <- as.numeric(gsub("%", "", perce_vv1))/100
我的目的是组合所有这些向量并创建一个数据框,但 位于原始向量的 structure/order 之后。换句话说,我想用 "right place" 中的 NA 填充数据框。因此,例如,我希望我的数据框看起来像这样:
df<-data.frame(original=vv, numerics=c(1,2,NA,0.02,3,NA,0.04), integers=c(1,2,NA,NA,3,NA,NA), characters=c(NA,NA,"c",NA,NA,"b",NA))
original numerics integers characters
1 1 1.00 1 <NA>
2 2 2.00 2 <NA>
3 c NA NA c
4 2% 0.02 NA <NA>
5 3 3.00 3 <NA>
6 b NA NA b
7 4% 0.04 NA <NA>
有人可以帮我完成这个任务吗?
我们可以为 %
('i1') 的元素创建一个数字索引,然后用 /100
替换那些 %
的元素,评估字符串并分配输出背部。对更改后的向量 ('vv1') 应用 as.numeric
将导致所有非数字都为 NA,类似地,我们可以对原始向量 ('vv') 执行 as.integer
并获得所有非数字到 NA。带字母的元素可以用grepl
标识,用ifelse
将所有其他元素转换为NA。
vv1 <- vv
i1 <- grep("%", vv)
library(gsubfn)
vv1[i1] <- sapply(gsubfn(".", list(`%`="/100"), vv[i1]), function(x) eval(parse(text=x)))
vv1 <- as.numeric(vv1)
vv2 <- as.integer(vv)
vv3 <- ifelse(grepl("^[A-Za-z]+$", vv), vv, NA)
data.frame(original=vv, numerics=vv1, integer=vv2, characters=vv3)
# original numerics integer characters
#1 1 1.00 1 <NA>
#2 2 2.00 2 <NA>
#3 c NA NA c
#4 2% 0.02 NA <NA>
#5 3 3.00 3 <NA>
#6 b NA NA b
#7 4% 0.04 NA <NA>