我搜索了档案但没有找到合适的答案。我是一个初学者,如果我提出一个非常基本的问题,请原谅我的无知。我试图让apply函数在处理数据帧时打印列名。我理解lapply将数据框的列转换为vector,但是它是在打印输出时打印列名的方法。如下例所示
> mydata<-data.frame(matrix(rep(c(1:2),times= 50),20,5))
> colnames(mydata)<-letters[1:5]
> lapply(mydata[,2:4],function(x){CrossTable(x,mydata[,5])})
我希望输出在打印输出表时显示正在处理的列名。它只打印&#34; x&#34;现在在列联表中。
答案 0 :(得分:0)
假设CrossTable()
包中包含descr
函数,dnn
的参数似乎在交叉表中给出了行名和列名。诀窍是让lapply
同时读取名称和数据。 names(mydata)[2:4]
给出了名字; mydata[, 2:4]
是数据。 lapply
的语法是:
lapply(x, FUN, ...)
FUN
适用于x
的每个元素,而...
允许将可选参数传递给FUN
。因此,names(mydata)[2:4]
和mydata[, 2:4]
都可以传递FUN
。
mydata<-data.frame(matrix(rep(c(1:2),times= 50),20,5))
colnames(mydata)<-letters[1:5]
library(descr)
lapply(names(mydata)[2:4],
function(dfNames, dfData) {
return(CrossTable(dfData[[dfNames]], mydata[,5], dnn = c(dfNames, "mydata[,5]")))
}, mydata[, 2:4] )
该函数对names(mydata)[2:4]
中的每个元素进行操作,数据文件作为附加参数传递。这样,相关列(dfData[[dfNames]]
)和相关列的名称(dfName
)可供CrossTable.
[[1]]
Cell Contents
|-------------------------|
| N |
| Chi-square contribution |
| N / Row Total |
| N / Col Total |
| N / Table Total |
|-------------------------|
===============================
mydata[,5]
b 1 2 Total
-------------------------------
1 10 0 10
5.000 5.000
1.000 0.000 0.500
1.000 0.000
0.500 0.000
-------------------------------
2 0 10 10
5.000 5.000
0.000 1.000 0.500
0.000 1.000
0.000 0.500
-------------------------------
Total 10 10 20
0.500 0.500
===============================
[[2]]
Cell Contents
|-------------------------|
| N |
| Chi-square contribution |
| N / Row Total |
| N / Col Total |
| N / Table Total |
|-------------------------|
===============================
mydata[,5]
c 1 2 Total
-------------------------------
1 10 0 10
5.000 5.000
1.000 0.000 0.500
1.000 0.000
0.500 0.000
-------------------------------
2 0 10 10
5.000 5.000
0.000 1.000 0.500
0.000 1.000
0.000 0.500
-------------------------------
Total 10 10 20
0.500 0.500
===============================
[[3]]
Cell Contents
|-------------------------|
| N |
| Chi-square contribution |
| N / Row Total |
| N / Col Total |
| N / Table Total |
|-------------------------|
===============================
mydata[,5]
d 1 2 Total
-------------------------------
1 10 0 10
5.000 5.000
1.000 0.000 0.500
1.000 0.000
0.500 0.000
-------------------------------
2 0 10 10
5.000 5.000
0.000 1.000 0.500
0.000 1.000
0.000 0.500
-------------------------------
Total 10 10 20
0.500 0.500
===============================
答案 1 :(得分:0)
好的,这已经过时了,但我遇到了同样的问题,想要分享我的方法,尽管它在某种程度上违反了*应用的想法。好处是:你可以在循环中集成任何东西。所以我需要在2个输出变量上运行ANOVA,这取决于我用lapply循环的列,获取p_values来注释绘图并并排创建多个绘图。 核心是它结合了for-loop和lapply
for (i in 0:10){
i<-i+1
lapply(df[i],function(x) {
myfactor<-names(df)[i] #gets the column name
anova_model_a<-lm(a~x,df) #needed to run ANOVA per column
anova_model_b<-lm(b~x,df) #needed to run ANOVA per column
tab_aov_a<-tidy(summary(anova_model_a)) #proper result table
tab_aov_b<-tidy(summary(anova_model_b)) #proper result table
labels_a <- data.frame(drv = "1", label=c(round(tab_aov_a$p.value[2],4))) #needed for labelling the graph. I only had 2 groups for comparison
labels_b <- data.frame(drv = "1", label=c(round(tab_aov_b$p.value[2],4))) #needed for labelling the graph
fig1<-ggplot(df,aes(x,a))+
geom_boxplot()+
ggtitle("a")+
geom_text(data=labels_a,aes(x=drv,y=12,label=label),colour="blue",angle=0,hjust=0.5, vjust=0.5,size=5)+
xlab(myfactor)
fig2<-ggplot(df,aes(x,b))+
geom_boxplot()+
ggtitle("b")+
geom_text(data=labels_b,aes(x=drv,y=6,label=label),colour="blue",angle=0,hjust=0.5, vjust=0.5,size=5)+
xlab(myfactor)
arrangement<-grid.arrange(fig1,fig2,nrow=2)
print(arrangement)
})
}