首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于列名首字母的子集数据框

基于列名首字母的子集数据框
EN

Stack Overflow用户
提问于 2014-02-10 22:31:46
回答 2查看 3.7K关注 0票数 0

我有一个大型数据框架,其中有多个列表示不同的变量,这些变量是针对不同的个体测量的。列的名称始终以数字开头(例如1:18)。我想要将df子集,并为每个人创建单独的dfs。下面是一个示例:

代码语言:javascript
复制
x <- as.data.frame(matrix(nrow=10,ncol=18))
colnames(x) <- paste(1:18, 'col', sep="")

我的实际df的列名是由单个ID、变量名和度量值的编号组成的(我对每个变量取了3个度量值)。例如,我有针对个体1的度量b (body),然后在df中,我将有3列命名为: 1b1,1b2,1b3。最后我有10个不同的区域(身体,头部,尾巴,尾部底部,背部,侧翼,腹部,喉部,前臂,腿)。所以对于每个人,我有30列(10个区域x每个区域3个度量值)。所以我有多个变量,以不同的数字开头,我想根据它们的唯一数字进行子集。我尝试使用grep:

代码语言:javascript
复制
partialName <- 1
df2<- x[,grep(partialName, colnames(x))]
colnames(x)
[1] "1col" "2col" "3col" "4col" "5col" "6col" "7col" "8col" "9col" "10col" 
"11col" "12col" "13col" "14col" "15col" "16col" "17col" "18col"

我的问题在这里,正如你所看到的,它没有分离个体,因为1和10在子集内。换句话说,这将选择从1开始的每个人。最终,我想要做的是循环遍历我所有的个体(1:18),为每个个体创建新的dfs。

EN

回答 2

Stack Overflow用户

发布于 2014-02-10 23:15:33

我认为将数据保存在一个data.frame中是最好的选择。或者将其放入data.frame的列表中,这使得提取每个人的汇总统计信息变得容易得多。

首先创建一些示例数据:

代码语言:javascript
复制
df = as.data.frame(matrix(runif(50 * 100), 100, 50), stringsAsFactors = FALSE)
names_variables = c('spam', 'ham', 'shrub')
individuals = 1:100
column_names = paste(sample(individuals, 50), 
                     sample(names_variables, 50, TRUE), 
                     sep = '')
colnames(df) = column_names

我首先要做的是使用melt将数据从宽格式转换为长格式。这实际上是将所有列堆叠在一个大向量中,并添加一个额外的列来说明它来自哪一列:

代码语言:javascript
复制
library(reshape2)
df_melt = melt(df)
head(df_melt)
  variable      value
1    85ham 0.83619111
2    85ham 0.08503596
3    85ham 0.54599402
4    85ham 0.42579376
5    85ham 0.68702319
6    85ham 0.88642715

然后我们需要将ID号从变量中分离出来。这里的假设是变量的数字部分是个人ID,文本是变量名:

代码语言:javascript
复制
library(dplyr)
df_melt = mutate(df_melt, individual_ID = gsub('[A-Za-z]', '', variable),
                          var_name = gsub('[0-9]', '', variable))

实质上删除了字符串中不需要的部分。现在我们可以做一些很好的事情,比如:

代码语言:javascript
复制
mean_per_indivdual_per_var = summarise(group_by(df_melt, individual_ID, var_name), 
                                       mean(value))
head(mean_per_indivdual_per_var)
  individual_ID var_name mean(value)
1            63     spam   0.4840511
2            46      ham   0.4979884
3            20    shrub   0.5094550
4            90      ham   0.5550148
5            30    shrub   0.4233039
6            21      ham   0.4764298
票数 1
EN

Stack Overflow用户

发布于 2014-02-10 23:16:07

看起来您的colnames是data.frame的标准a,所以要获得第1列,您可以这样做:

代码语言:javascript
复制
df2 <- df[,1] #Where 1 can be changed to the number of column you wish.

不需要通过部分名称进行子集。尽管不建议您这样做,但您可以创建一个循环来执行此操作:

代码语言:javascript
复制
for (i in ncol(x)){
  assing(paste("df",i), x[,i]) #I use paste to get a different name for each column
}

尽管@paulhiemstra解决方案避免了这个循环。

因此,有了新的信息,您就可以使用grep随心所欲地执行操作,但要特别指出您期望的匹配数:

代码语言:javascript
复制
df2<- x[,grep("1{30}", colnames(x))] 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21679910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档