循环遍历列并添加其他行

时间:2014-05-27 21:57:44

标签: arrays r loops csv for-loop

编辑:我取得了一些进展。所以我读了子集,并能够在一定条件下分解我的数据帧。假设titleCSV [3]由文件名(“file1”,“file2”,“file3”等)组成,titleCSV [13]包含值(-18,-8,-2等)。代码如下:

titleRMS <- data.frame(titleCSV[3], titleCSV[13])



for(x.RMS in titleRMS[2]){
    x.RMS <- gsub("[A-Za-z]","",r)
    x.RMS <- gsub(" ","",r)
    x.RMS = abs(as.numeric(r))
}

x.titleRMSJudge <- data.frame(titleRMS[1], x.RMS)
x.titleRMSResult <- subset(x.titleRMSJudge, r < 12)

我现在的问题是,打印x.titleRMSResult第一列的每一行的最佳方法是什么?谢谢,伙计们!

顺便说一下,这是我的titleRMS的输入:

dput(titleRMS)
structure(list(FILE.NAME = c("00-Introduction.mp3", "01-Chapter_01.mp3", 
"02-Chapter_02.mp3", "03-Chapter_03.mp3", "04-Chapter_04.mp3", 
"05-Chapter_05.mp3", "06-Chapter_06.mp3", "07-Chapter_07.mp3", 
"08-Chapter_08.mp3", "09-Chapter_09.mp3", "10-Chapter_10.mp3", 
"11-Chapter_11.mp3", "12-Chapter_12.mp3", "Bonus_content.mp3", 
"End.mp3"), AVG.RMS..dB. = c(-14, -10.74, -9.97, -10.53, -10.94, 
-12.14, -11, -9.19, -10.42, -11.51, -14, -10.96, -11.71, -11, 
-16)), .Names = c("FILE.NAME", "AVG.RMS..dB."), row.names = c(NA, 
-15L), class = "data.frame")


以下原始帖子 纽布在这里!在R中编码所以我试图分析一个csv文件。一列有10行,文件名不同,而另一列有10行,值不同。我想将第二列运行到循环中,如果它大于/小于某个值,我希望它打印关联文件名和消息。我不知道如何让两个列一起循环运行,以便使用正确的值/消息打印正确的文件名。我写了一个循环,最终检查每个值的行数和其他列中的行数一样多。目前,所有10行都符合我要打印的消息的标准,所以我收到了100条消息!

titleRMS <- data.frame(titleCSV[3], titleCSV[13])

for(title in titleRMS[1]){
    title <- gsub(" ","",title)
}

for(r in titleRMS[2]){
    r <- gsub("[A-Za-z]","",r)
    r <- gsub(" ","",r)
    r = abs(as.numeric(r))

    for(t in title){
        for(f in r){
            if (f < 18 & f > 0) {
                message(t, "is Loud!") 
            }
        }
    }
}

这行代码只打印每条消息的第一个文件名:

for(r in titleRMS[2]){
    r <- gsub("[A-Za-z]","",r)
    r <- gsub(" ","",r)
    r = abs(as.numeric(r))
    for(f in r){
        if (f < 18 & f > 0) {
            message(t, "is Loud!") 
        }
    }
}

有人可以给我一些提示,甚至重写我写的内容,告诉我如何得到我需要的东西吗?谢谢,伙计们!

2 个答案:

答案 0 :(得分:1)

你在努力使自己变得艰难。你不需要正则表达式,你可能不需要循环,至少不需要通过数据框。当然你不需要嵌套循环。 我想这会做你想说的......

indicesToMessage <- titleRms[, 2] > 0 & titleRms[, 2] < 18
myMessages <- paste(titleRms[indicesToMessage, 1], "is Loud!")

for (i in 1:length(myMessages)) {
  message(myMessages[i])
}

更像R的方式(读取:没有显式循环)来做最后一行是这样的:

invisible(lapply(myMessages, message))

invisible是必需的,因为message()不返回任何内容,只是打印到控制台有副作用,但lapply需要返回并打印{{1}如果没有。 NULL只会屏蔽invisible

编辑:负数据

由于您的数据是否定的,我认为当绝对值NULL介于0和18之间时,您确实需要消息。这适用于该情况。

abs()

答案 1 :(得分:1)

我已经找到了自己的问题。以下是我写的要得出的结论:

titleRMS <- data.frame(titleCSV[3], titleCSV[13])

filesHighRMS <- vector()
x.titleRMSJudge <- data.frame(titleCSV[3], titleCSV[13])
x.titleRMSResult <- subset(x.titleRMSJudge, titleCSV[13] > -12 & titleCSV[15] > -1)

    for(i in x.titleRMSResult[,1]){
    filesHighRMS <- append(filesHighRMS, i, 999)
    }

emailHighRMS <- paste(filesHighRMS, collapse=", ")
blurbHighRMS <- paste("" ,nrow(x.titleRMSResult), " file(s) (" ,emailHighRMS, ") have a high RMS and are too loud.")

对代码不熟悉,我打赌有一种更简单的方法,我很高兴能够自己解决这个问题。 : - )