是否有更好的(即矢量化)将一部分列名称放入R中的数据框架的方法
-
24-09-2019 - |
题
我在R中有一个数据框架,该数据帧来自运行融化/铸造操作结果的一些统计数据。我想将一行添加到包含名义值的数据框架中。每个列的名称中都存在该名义值
df<-as.data.frame(cbind(x=c(1,2,3,4,5),`Var A_100`=c(5,4,3,2,1),`Var B_5`=c(9,8,7,6,5)))
> df
x Var A_100 Var B_5
1 1 5 9
2 2 4 8
3 3 3 7
4 4 2 6
5 5 1 5
因此,我想创建一个新行,该行在VAR B_5中的var a_100和'5'列中包含“ 100”。目前,这是我正在做的事情,但我敢肯定,必须有一种更好的,矢量化的方法来做到这一点。
temp_nom<-NULL
for (l in 1:length(names(df))){
temp_nom[l]<-strsplit(names(df),"_")[[l]][2]
}
temp_nom
[1] NA "100" "5"
df[6,]<-temp_nom
> df
x Var A_100 Var B_5
1 1 5 9
2 2 4 8
3 3 3 7
4 4 2 6
5 5 1 5
6 <NA> 100 5
rm(temp_nom)
通常,我有16-24列。有任何想法吗?
解决方案
您可以创建 temp_nom
通过两种方式(至少):
# strsplit create list so you can sapply on it
sapply(strsplit(names(df),"_"), "[", 2)
# using regular expressions:
sub(".+_|[^_]+", "", names(df))
为了提示,您可以转换 temp_nom
到数字(在其他情况下,它与列类型混乱)
df[nrow(df)+1,] <- as.numeric(temp_nom)
当然,您可以一行完成:
df[nrow(df)+1,] <- as.numeric(sapply(strsplit(names(df),"_"), "[", 2))
# or
df[nrow(df)+1,] <- as.numeric(sub(".+_|[^_]+", "", names(df)))
不隶属于 StackOverflow