在R中引用变量行号

时间:2018-08-02 21:02:31

标签: r variables reference row

我是R的新手,感谢您在以下问题上的帮助:

我有一段代码遍历名为m的数据集的一列中的所有值(x),并通过for循环将它们与固定值一一比较。我希望仅当m [(SAME ROW AS x),“ reference_column_name”]中的单元格包含某个字符串时,才将x与固定值(0.17)进行比较。

目标是在m的末尾获得x值与基于x的行与x相同的引用列中的单元格进行比较的值0、1、2或3的列。像这样:

new_column
0
2
2
3
1
1
2
0
3

如何引用x的行(随着for循环的继续,变量不断变化)? 我可以用什么替换“(SAME ROW AS x)”?

这是我的代码:

m$new_colum <- 0  #I start by assigning everything the value 0.


for (x in m$current_column) {
  if ((grepl("string",((m[(SAME ROW AS x),"reference_column_name"])),fixed=TRUE))==TRUE){ 
    if (is.na(x)){ 
      m$new_column<-0
      }
    else if (x <= 0.17) { 
      m$new_column<-1}
    else if (x > 0.17) {
      m$new_column<-2}
  }
  else {m$new_column<-3}
}

我更改了所有变量和列名称,以使阅读此问题更加容易-我知道名称应该更短。

感谢您的帮助!

3 个答案:

答案 0 :(得分:0)

也许这不是您真正想要的,但看起来像那样。

创建一些示例数据:

df <- data.frame(c(NA, -10:88),
             rep(c("a", "b", "c", "d", "e"), 20),
             stringsAsFactors = FALSE)

固定值为“ 1”,固定字符串为“ a”:

new_col <- ifelse(is.na(df[,1]) == TRUE & df[,2] == "a", 0, 
           ifelse(df[,1] == 1 & df[,2] == "a", 1, 
           ifelse(df[,1] < 1 & df[,2] == "a", 2, 
           ifelse(df[,1] > 1 & df[,2] == "a", 3, 99))))

> new_col
  [1]  0 99 99 99 99  2 99 99 99 99  2 99 99 99 99  3 99 99 99 99  3 99
 [23] 99 99 99  3 99 99 99 99  3 99 99 99 99  3 99 99 99 99  3 99 99 99
 [45] 99  3 99 99 99 99  3 99 99 99 99  3 99 99 99 99  3 99 99 99 99  3
 [67] 99 99 99 99  3 99 99 99 99  3 99 99 99 99  3 99 99 99 99  3 99 99
 [89] 99 99  3 99 99 99 99  3 99 99 99 99

答案 1 :(得分:0)

据我对您问题的理解,这是我的解决方案:

m$new_column <- ifelse(grepl("string", m$ref_column), ifelse(is.na(m$x), 0, ifelse(m$x <= 0.17, 1, 2)), 3)

此代码将首先检查同一行的参考列中的字符串。如果找不到,它将等于3。如果找到,它将进一步进入第二个ifelse块。
  -在此块中,它将首先检查NA并分配一个0,否则它将进入第三个ifelse块,在此最后检查“ x”列的值是否等于或小于0.17并分配其他2个。

希望这会有所帮助

答案 2 :(得分:0)

可以使用一系列正确索引的分配:

 dat <- data.frame( x=runif(20), ref_col=sample( c("string", "not string"), 20,  repl=TRUE) )
 dat$new_col[dat$x > 0.17 & dat$ref_col=="string"] <- 2
 dat$new_col[dat$x <= 0.17 & dat$ref_col=="string"] <- 1
 dat$new_col[ is.na(dat$x)] <- 0
 dat$new_col[ dat$ref_col != "string"] <- 3
 dat

我的x中没有NA,但我预计它们会被正确分配