【问题标题】:Want my for loop to return letters instead of numbers in R希望我的 for 循环返回字母而不是 R 中的数字
【发布时间】:2016-05-11 13:24:24
【问题描述】:
for(k in seq(0,length(Gs@left)-nl,len=30))
{
fcs <- abs(fft(Gs@left[(k+1):(k+nl)]))
tmp <- lsfit(X,fcs,inter=F)
print(order(-tmp$coef)[1])
}

我有一个返回数字列表的 for 循环:

[1] 3
[1] 1
[1] 1
[1] 2

这些数字对应于钢琴上的音符,如果它返回 G4 而不是 1、A4 而不是 2 等会更有用...

有没有办法对我的 for 循环进行编码以返回它(即 1 = "G4" 等...)?

我尝试了 assign(paste("G4"), 1) 但这不起作用。

谢谢

【问题讨论】:

  • 如果你有钢琴音符的整数列表,你可以在得到订单后使用匹配
  • 如果您发布与您的代码一起运行的数据示例,我们可以更轻松地提供解决您问题的代码。将dput(mydata) 的输出粘贴到您的问题中(其中mydata 是您要提供的任何数据样本)。
  • 另一种选择是使用listx &lt;- list(G4 = 1, A4 = 2) 然后你可以使用which 返回索引。

标签: r for-loop variable-assignment assign


【解决方案1】:

由于缺少所需信息,因此答案不准确,但这应该会给您一些提示

df<-data.frame(id=1:10, note=LETTERS[1:10], stringsAsFactors = F)

for (i in 1:5){
  x=sample(1:10,1)
  #print(x)
  print(df[match(x,df$id),2])
}

【讨论】:

    【解决方案2】:

    尝试使用因子:

    例子:

    data <- c(1,2,3,4,5, 1,3,4)
    labeled_data <- factor(data, labels = c("a1", "a2", "a3", "a4", "a5"))
    labeled_data
    

    会返回

    [1] a1 a2 a3 a4 a5 a1 a3 a4
    Levels: a1 a2 a3 a4 a5
    

    【讨论】:

    • 谢谢,它返回 Levels 行的事实确实很烦人,但会妨碍您。
    【解决方案3】:

    编写一个函数来进行翻译可能是最有意义的。

    strfnote <- function(notes, base_octave=4) {
      paste0(LETTERS[(notes %% 7) + 1], trunc(notes / 7) + base_octave)
    }
    

    这会给我们带来什么

    > strfnote(0:10)
     [1] "A4" "B4" "C4" "D4" "E4" "F4" "G4" "A5" "B5" "C5" "D5"
    

    您可以使strfnote 更完整,处理诸如意外事件之类的事情,并准确指定与“0”相对应的音符以设置偏移量。但经过一些基本处理后,您的代码可以生成数字,然后进行渲染,您只需将它们传递给此函数即可获得可读的形式。

    【讨论】:

      【解决方案4】:

      只需设置一个字符串,其中的音符按您的音乐惯例所暗示的顺序排列(我不能凭直觉认为这完全是音乐性的,并且看到 @user295691 可能实际上理解了数学基础)。由于您只给出了两个注释:

      # Above the loop
      notes=c("G4", "A4", "B4")   # not sure if third one is sensible musically
                                  # would have guessed that A5 was next to G4
      # in the loop
      print( notes[ order(-tmp$coef)[1] ] )
      

      【讨论】:

      • 谢谢,我认为这取决于音乐来自哪个国家。但是我在哪里,它从 C 到 C,所以 C4、D4、E4、F4、G4、A4、B4、C5 等......这很好用,谢谢
      • 这可能会有用:paste0( rep( LETTERS[c(3:8,1:2)], 5), rep(1:5, each=8) )
      【解决方案5】:

      您可以建立一个钢琴笔记列表并通过索引 [[i]] 访问项目。

      对于您的示例,这将是:

      pianoNotes <- list("1" = "G4") # and more
      for(k in seq(0,length(Gs@left)-nl,len=30))
      {
        fcs <- abs(fft(Gs@left[(k+1):(k+nl)]))
        tmp <- lsfit(X,fcs,inter=F)
        print(pianoNotes[[order(-tmp$coef)[1]]])
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-17
        • 2012-12-15
        • 1970-01-01
        • 2019-01-19
        • 2023-01-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多