我在尝试用R编写代码脚本时遇到了一些麻烦,以便它无需手动指定子集命令就可以根据数据帧列中的字符分隔数据帧。下面是在R中复制的脚本:
a=c("Model_A","R1",358723.0,171704.0,1.0,36.818500,4.0222700,1.38895000)
b=c("Model_A","R2",358723.0,171704.0,2.6,36.447300,4.0116100,1.37479000)
c=c("Model_A","R3",358723.0,171704.0,5.0,35.615400,3.8092600,1.34301000)
d=c("Model_B","R1",358723.0,171704.0,1.0,39.818300,2.4475600,1.50384000)
e=c("Model_B","R2",358723.0,171704.0,2.6,39.391600,2.4209900,1.48754000)
f=c("Model_B","R3",358723.0,171704.0,5.0,38.442700,2.3618400,1.45126000)
g=c("Model_C","R1",358723.0,171704.0,1.0,31.246400,2.2388000,1.30652000)
h=c("Model_C","R2",358723.0,171704.0,2.6,30.911600,2.2144800,1.29234000)
i=c("Model_C","R3",358723.0,171704.0,5.0,30.166700,2.1603000,1.26077000)
df=data.frame(a,b,c,d,e,f,g,h,i)
df=t(df)
df=data.frame(df)
col_list=list("Model","Receptor.name","X(m.)","Y(m.)","Z(m.)",
"nox","PM10","PM2.5")
colnames(df)=col_list
基本上,我正在尝试通过模型名称(“ Model_A”,“ Model_B”和“ Model_C”)分隔数据帧(df),并将它们存储在新的不同数据帧中。我一直在尝试使用以下命令
df_test=split(df,with(df,interaction(Model,Model)), drop = TRUE)
此命令将数据框分开,但将其存储在列表中,我不知道如何单独提取列表并将其存储为数据框。有没有更简单的解决方案(如果可能的话,尽量避免使用subset命令,因为我需要脚本是动态的和相对的),或者有人知道如何使用上面显示的最后一个命令来将列表分成单独的数据帧吗?同样,如果可能,是否可以在模型之后命名数据框?
如果这些问题很多,我深表歉意,但是任何帮助将不胜感激!谢谢!
答案 0 :(得分:1)
list2env(split(df, df$Model), envir = .GlobalEnv)
将在全局环境中为您提供三个以模型命名的数据框,其中包含相关行。
> Model_A
Model Receptor.name X(m.) Y(m.) Z(m.) nox PM10 PM2.5
a Model_A R1 358723 171704 1 36.8185 4.02227 1.38895
b Model_A R2 358723 171704 2.6 36.4473 4.01161 1.37479
c Model_A R3 358723 171704 5 35.6154 3.80926 1.34301
尽管我只使用dflist <- split(df, df$Model)
保留了三个数据帧的列表。
为什么要列出?列表允许您使用lapply
-一种循环函数,该函数对每个列表元素进行操作。一个简单的例子:假设您要为所有三个数据集的数据中的两个PM
变量获取一个频率表。
对于您的全球环境中的单个元素,将是
table(Model_A$PM10)
table(Model_A$PM2.5)
...
table(Model_C$PM2.5)
有了列表,它将是
lapply(dflist, function(x) table(x["PM10"]))
lapply(dflist, function(x) table(x["PM2.5"]))
现在,似乎只保存了几行代码,但更好的是,lapply
的输出还是list
,您可以将其存储在对象中并进一步用于不同的操作。因此,您可以在一个只有几个对象的全局环境中,每个对象都是包含某些相似对象的列表,例如数据框,表格,汇总甚至是绘图。