我遇到的问题与此非常相似:Populating a data frame in R in a loop。我似乎无法在循环中填充矩阵。
myDF <- read.csv('corpusFiltered.txt.gz', header = TRUE, sep = '\t')
phylum = sort(unique(myDF$PHYLUM))
myDF.mean = ddply(myDF, .(ENVIRONMENT, FILENAME, PHYLUM), summarize, MeanX = mean(X, na.rm=TRUE) )
df_all = myDF.mean[c(4, 3)] #select only the X and Phylum
c_all = unstack(df_all) #restructure dataframe
columnPhylum1 = matrix(ncol=1, nrow=length(phylum))
GET_X = function(dataset)
{
for (i in 1:length(phylum))
{
print(phylum[i])
columnPhylum1[i,] <- phylum[i] #this does not populate the matrix. still 'NA'
}
}
GET_X(c_all)
print('')
print(columnPhylum1)
这不起作用。输出是:
[1] Actinobacteria
Levels: Actinobacteria Bacteroidetes Chlamydiae Crenarchaeota Deinococcus-Thermus Euryarchaeota Firmicutes Proteobacteria Spirochaetes Tenericutes ***
[1] Bacteroidetes
[1] Chlamydiae
[1] Crenarchaeota
[1] Deinococcus-Thermus
[1] Euryarchaeota
[1] Firmicutes
[1] Proteobacteria
[1] Spirochaetes
[1] Tenericutes
[1] ""
[,1]
[1,] NA
[2,] NA
[3,] NA
[4,] NA
[5,] NA
[6,] NA
[7,] NA
[8,] NA
[9,] NA
[10,] NA
***为了简洁起见,我删除了子序列&#34; Levels&#34;来自除第一个原核生物(Actinobacteria)以外的所有信息。
但是,如果我制作一个人造矩阵......
sig= matrix(ncol=1, nrow=length(phylum))
for (i in 1:length(phylum)){sig[i,]<-i}
print(sig)
这就像一个魅力。
[,1]
[1,] 1
[2,] 2
[3,] 3
[4,] 4
[5,] 5
[6,] 6
[7,] 7
[8,] 8
[9,] 9
[10,] 10
也许我看不到树林;我检查了明显的事情(例如正确的变量名称),我一直无法找到任何问题。我能看到的唯一区别是top从函数调用循环。我不明白为什么我会从相同的&#39;中获得不同的行为。码。非常感谢任何帮助。
答案 0 :(得分:2)
我想问题是你试图在一个数字矩阵中复制一个因子变量的值(这就是为什么你的&#34; faux&#34;矩阵确实有效,因为它插入了数字,而不是因素) 。当你试图复制你已经拥有的整个矢量时,我真的不明白你在矩阵中需要它的原因。无论如何,也许这个简单的代码就是你真正想要做的:
vect <- factor(c('foo', 'bar', 'foo'), levels = c('foo', 'bar'))
mat <- as.matrix(vect)
mat
输出:
[,1]
[1,] "foo"
[2,] "bar"
[3,] "foo"
编辑:在您的具体情况下,这将转化为:
columnPhylum1 <- as.matrix(phylum)
答案 1 :(得分:0)
这可能与您的phyla
向量包含因素有关。
尝试将phyla
强制转换为字符向量:
char_phyla <- as.character(phyla)
如果可行,您可以在不使用自动分解的情况下读取csv数据:
myDF <- read.csv('corpusFiltered.txt.gz', header=T, sep='\t', stringsAsFactors=F)