我有一个大型数据框架,其中有多个列表示不同的变量,这些变量是针对不同的个体测量的。列的名称始终以数字开头(例如1:18)。我想要将df子集,并为每个人创建单独的dfs。下面是一个示例:
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:
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。
发布于 2014-02-10 23:15:33
我认为将数据保存在一个data.frame中是最好的选择。或者将其放入data.frame的列表中,这使得提取每个人的汇总统计信息变得容易得多。
首先创建一些示例数据:
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将数据从宽格式转换为长格式。这实际上是将所有列堆叠在一个大向量中,并添加一个额外的列来说明它来自哪一列:
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,文本是变量名:
library(dplyr)
df_melt = mutate(df_melt, individual_ID = gsub('[A-Za-z]', '', variable),
var_name = gsub('[0-9]', '', variable))实质上删除了字符串中不需要的部分。现在我们可以做一些很好的事情,比如:
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发布于 2014-02-10 23:16:07
看起来您的colnames是data.frame的标准a,所以要获得第1列,您可以这样做:
df2 <- df[,1] #Where 1 can be changed to the number of column you wish.不需要通过部分名称进行子集。尽管不建议您这样做,但您可以创建一个循环来执行此操作:
for (i in ncol(x)){
assing(paste("df",i), x[,i]) #I use paste to get a different name for each column
}尽管@paulhiemstra解决方案避免了这个循环。
因此,有了新的信息,您就可以使用grep随心所欲地执行操作,但要特别指出您期望的匹配数:
df2<- x[,grep("1{30}", colnames(x))] https://stackoverflow.com/questions/21679910
复制相似问题