【问题标题】:Making a dummy column based on a range of values with a huge data set基于具有庞大数据集的一系列值创建一个虚拟列
【发布时间】:2014-06-19 06:43:38
【问题描述】:

我想根据列的值范围对数据进行排序。我的数据很大,但我做了一个小数据集作为工作示例:

 cats   colour  length  weight      mew
     1        5        3      3      0      
     2        4        4      2      0  
     3        3        5      3      0  
     4        2        9      4      1
     5        4       22      1      1 
     43       43             90      0
     22
     15               32     45
     25
              32      23       4     0
     35       2       29

这是我的 broken 代码,它应该基于列排序并根据列的值添加一个虚拟列:

x <- data$cats  # how to refer to a column: name_of_data_set_$_what column you want e.g. data$mass

x$dog <- ifelse(x$x>0 & x$x>3)

animal <- function(x) { 

  if ( x > 0 | x <3) {

  return(cbind( data , dog = 0))  

  } else { if (x > 4 | x < 6) {

  return(cbind( data , dog = 1))

  } else {

  return(cbind( data , dog = 2))

  }
  }
  }


animal(x)
summary(animal)



dput(head(data, 10))



animal(x)

代码应该做什么:

所以列是 1、2、3 和 4 应该是这样的:

 cats   colour  length  weight      mew     dog
     1        5        3      3      0      0      
     2        4        4      2      0      0
     3        3        5      3      0      0
     4        2        9      4      1      1
     5        4       22      1      1             
     43       43             90      0
     22
     15               32     45
     25
              32      23       4     0
     35       2       29

【问题讨论】:

  • data &lt;- read.csv(..., stringsAsFactors = FALSE) 重新阅读并重试。此外,您的函数中不会发生排序。
  • 请用dput(head(data, 10)) 的输出发布可重现的数据,我会进一步解释。
  • 我将该代码添加到底部:结构(列表(cats.colour.length.weight.mew =结构(c(3L,5L,7L,8L,9L,1L,2L,6L, 4L), .Label = c(",43,,,", "0,23,1,,1", "1,5,3,3,0", "13,1,,2,", " 2,4,4,20,1", "23,11,,,", "3,3,5,30,0", "4,2,9,43,0", "5,1,4 ,22,1"), class= "因子")), .Names = "cats.colour.length.weight.mew", row.names = c(NA, 9L), class= "data.frame")
  • 抱歉,我的意思是要发布来自dput(data)结果。也请从animal(x)发布结果

标签: r if-statement dataset multiple-columns large-data


【解决方案1】:

请停止更改原始帖子。对于第一次查看这篇文章的用户来说,它使答案看起来像是对从未存在的问题的修复。

问题:您正在读取的文件是逗号分隔的吗?


您的原始帖子存在几个明显的问题。

让我们从dput 的输出开始(应该将其从 cmets 移至原始帖子,以便其他人轻松查看)。

structure(list(cats.colour.length.weight.mew = ## that's not right
               structure(c(3L, 5L, 7L, 8L, 9L, 1L, 2L, 6L, 4L), 
               .Label = c(",43,,,", "0,23,1,,1", "1,5,3,3,0", "13,1,,2,", 
                          "2,4,4,20,1", "23,11,,,", "3,3,5,30,0", 
                          "4,2,9,43,0", "5,1,4,22,1"), 
               class = "factor")),
          .Names = "cats.colour.length.weight.mew",  ## that's not right
          row.names = c(NA, 9L), 
          class = "data.frame")

从带有read.csv 的文件中读取时,R 默认将character 字符串列分类为factor 变量。 R 对因子的看法与对数字或字符元素的看法不同。反过来,排序与因子变量的工作方式不同。

尝试使用stringsAsFactors = FALSE

data <- read.csv("filename.csv", stringsAsFactors = FALSE)

接下来,你的函数最后应该只有一个return 语句。在if-else 语句中分配一个变量并返回该变量。

添加我实际上并不确定上述说法。需要做一些进一步的研究。

此外,else if (x &gt; 4 | x &lt; 6) 中的 elseif 之间不需要 {

animal <- function(x)
{ 
    if ( x > 0 | x < 3 ){
        return(cbind( data , dog = 0))
    } else if (x > 4 | x < 6){
        return(cbind( data , dog = 1))
    } else {
        return(cbind( data , dog = 2))
    }
    ## return(y) removed 
}

第三,animal 被定义为一个函数,而不是一个变量。并且summary(animal) 不会调用您的函数。要拨打电话,请使用animal(x)。然后,可以通过summary(animal(x))获得摘要

在我能够重现您的数据之前,我可以告诉您的就这么多。请将 cmets 中的 dput 输出移至原始帖子,以便查看此问题的每个人都能看到。

【讨论】:

    【解决方案2】:

    如果您想创建一个基于现有变量范围的新变量,请查看cutfindInterval 函数。您应该只需要其中一个,但它们的工作方式略有不同。

    另外我认为您在上面的代码中将|&amp; 的含义颠倒了,ifelse 函数应该有 3 个参数才有意义。

    【讨论】:

      【解决方案3】:

      我认为您的过滤条件不一致,并且您将 if else 语句混淆了一点。我不知道,如果这是你想要达到的目标:

      x <- data.frame(cat=1:10)
      
      x$dog <- ifelse(x$cat > 0 & x$cat <= 3, 0,
                      ifelse(x$cat >= 4 & x$cat <= 6, 1, 2))
      
      # output is
         cat dog
      1    1   0
      2    2   0
      3    3   0
      4    4   1
      5    5   1
      6    6   1
      7    7   2
      8    8   2
      9    9   2
      10  10   2
      

      【讨论】:

        【解决方案4】:

        不太清楚你想做什么......试试R中的sortorder

        例如

        x <- read.table("test.txt",header=T,sep="\t")
        x[order(x$cats),]
        

        更新:从您的代码中仍然不太清楚您与什么比较...但是试试这个

        x$dog <- ifelse(x$PUT_YOUR_PARAMS_THERE>0 & x$ANOTHER_PARAM >1, 1, 0)
        

        【讨论】:

        • 我想根据 cat 列的每个值向新列中插入一个值
        • 2 个新错误:对象 [[i]] 中的错误:“闭包”类型的对象不是子集 if (x > 0 | x
        • 我做了,我得到: if (x > 0 | x 对因子 2 没有意义:在 Ops.factor(x, 3) 中: 0 | x 1 并且只有第一个将使用元素>感谢您的帮助。我在 x: x$dog 0 & x$x>3) 上方添加了您的代码,但出现了该错误。我留在这个页面上:)
        猜你喜欢
        • 1970-01-01
        • 2022-10-24
        • 2020-01-11
        • 2015-03-10
        • 2023-04-06
        • 1970-01-01
        • 2016-09-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多