使用多个变量使用R创建表(List-Solution)

时间:2014-03-11 14:54:16

标签: r lapply

我一直在处理一个包含六个项目的数据集,我需要在整个分析中背靠背参考。我在R中相当新手,直到现在我只是复制了''''''''''''''''''''6 6 6 6 6 6 6 6 6 6 6 6

我知道在STATA中你可以使用列表进行'foreach'循环,只需在每次插入列表中的项目时在代码中设置占位符。我试图使用'for'-loop重新创建这样的东西,失败了,然后上网了。经过几个小时的搜索,我真正得到的是“不要制作僵尸代码,使用列表”:)

所以我开始阅读有关列表和lapply()函数的教程和其他材料,但我不能真正落后于如何做我想做的事情。

以下是我想要做的一个例子:

t_var1 <- table ( mydata$var1, mydata$constant ) #crosstable
p_var1 <- round ( prop.table ( crosstable ) *100, 1 ) #proptable

我希望为变量1到6做这样的事。

我在'for'-loop上的最后一次尝试看起来像这样(crosstable的例子):

varlist <- c("var1", "var2", "var3", "var4", "var5", "var6")
for (var in 1:6){ 
    eval(parse(text=paste("t_", varlist[[var]],sep=""))) <- table (eval(parse(text=paste("mydata$", varlist[[var]],sep=""))), mydata$constant) }

我还尝试使用paste()(w / o eval(parse)),get()和'varlist'作为list()。无论哪种方式,它都会产生错误消息。考虑到整个互联网告诉我使用列表和应用函数,我倾向于相信我应该。

我已经知道列表可以包含不同类的元素,因此您可以或多或少地用您喜欢的任何内容填充它们。我想我也理解如何使用[]和[[]]来引用单个列表项。不幸的是,到目前为止我读过的所有教程和示例都使用lapply()来表示mean或summary等函数。所以我要问的是如何使用列表和正确的apply-function创建具有不同输入和输出名称的多个表(当然可以放在同一个列表中)以继续我的理解。

提前感谢您的帮助!如果需要任何进一步的信息,只需评论,我会尽力提供。

最诚挚的问候, 利奥

2 个答案:

答案 0 :(得分:1)

您可以在varlist循环中使用字符串向量for的值:

attach(mydata)
crosstables<-list(NULL)
for(i in varlist)
 {crosstables[[i]]<-table(get(i),constant)}
crosstables

我希望我理解,这有帮助。

修改:一种更好的方法,使用lapply()

lapply(mydata[1:6],table,mydata$constant)

答案 1 :(得分:0)

我不确定我是否正确理解了您的问题,但这有帮助吗?

# Creating example data
my.data <- matrix(rnorm(40,mean=1),ncol=4)
my.data2<- matrix(jitter(rbinom(20, 10, 0.7)),ncol=2)

# producing variable names
number.of.var <- dim(my.data)[2]
var.names <- c()
for (i in 1:number.of.var) {
  var.names <- c(var.names, paste("var",i, sep="_"))
}
var.names

# save data to a list
new.list <- list()
for (col in 1:number.of.var) {
  new.list[[col]] <- my.data[,col]
}
# name list elements
names(new.list) <- var.names

# add other table
new.list[5] <- list(my.data2)
names(new.list)[5] <- "last.not.least"

# watch at content of list
str(new.list)

# create new list with percentage data
new.list.percentage <- lapply(new.list, 
                              function(x) {
                                return(x*100)
                              }
)

# You can also access the elements of the list with a for-loop directly:
par(mfrow=c(2,3))
for (element.in.list in new.list) {
  plot(element.in.list)
}

我确信这远非最佳状态,很快就会有更深刻的知识回答,但也许有点帮助。对不起,如果我没有正确理解你的问题。

编辑:添加了第二个表,以便您可以看到该列表可以具有不同的尺寸标注元素。你可以直接访问它们(参见情节循环),但对于最后一个元素它没有多大意义。