【问题标题】:R: ifelse, return a subset based on a conditionR:ifelse,根据条件返回子集
【发布时间】:2016-01-21 10:18:03
【问题描述】:

我还在学习 R,但遇到了一些我无法理解的东西。我花了大约 2 个小时试图自己解决这个问题,但失败了 :-( .

我有一个我想使用 ifelse 进行子集化的 data.frame(例如,让我们想想 iris)。如果第一行是“setosa”,我想要一个带有前 50 行的 data.frame,如果不是,接下来的 100 行。见下文。

data (iris)
a <- ifelse(iris$Species[1] == "setosa", iris[1:50,],iris[51:150,])

我希望上面返回原始 data.frame 的子集,但我实际得到的是

[[1]]
 [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9 5.4 4.8 4.8 4.3 5.8 5.7 5.4 5.1 5.7 5.1 5.4 5.1 4.6
[24] 5.1 4.8 5.0 5.0 5.2 5.2 4.7 4.8 5.4 5.2 5.5 4.9 5.0 5.5 4.9 4.4 5.1 5.0 4.5 4.4 5.0 5.1 4.8
[47] 5.1 4.6 5.3 5.0

我只是不明白...

【问题讨论】:

    标签: r if-statement subset


    【解决方案1】:

    您可以阅读ifelse 文档

    ifelse 返回一个与test 形状相同的值,该值被填充 元素从是或否中选择,具体取决于是否 test 的元素是 TRUEFALSE

    所以如果test 是一个向量,它返回一个向量,如果它是一个单一的值,它返回一个单一的值等等。如果你提供错误的参数,它会产生垃圾结果。举个例子

    > ifelse(1:10<5, 1, 0)
    [1] 1 1 1 1 0 0 0 0 0 0
    > ifelse(1:10<5, 0, 1:10)
    [1]  0  0  0  0  5  6  7  8  9 10
    > ifelse(TRUE, 1, 0)
    [1] 1
    > ifelse(TRUE, 1:10, 0)
    [1] 1
    

    在你的情况下,你应该使用

    if (condition) ... else ...
    

    ifelseif ... else ... 是不同的函数,ifelse 不是另一个函数的单行。 ifelse 所做的是遍历某个对象,并根据一些 test 返回 TRUEFALSE 替换该对象中的值,以便 每个 值被替换。

    【讨论】:

    • 谢谢你:-)。快速准确的响应。这个功能对我来说似乎很明显,我在文档中查找它 - 我的错误。
    • 我很确定几乎每个人都会通过这些错误发现它的真正工作原理;)
    【解决方案2】:
    if (iris$Species[1] == "setosa") a <- iris[1:50,] else a <- iris[51:150,]
    

    a <- if (iris$Species[1] == "setosa") iris[1:50,] else iris[51:150,]
    

    【讨论】:

    • 这意味着您事先知道索引,这通常不是一个好主意
    • @vaettchen:就像原来的问题一样。我不知道为什么用户 rpl 想要这样做。我也认为 rpl 想要像子集(iris,Species=="setosa") 之类的东西,但问题不在于那个。
    • 没错,但我想这是为了展示预期的结果,而不是预期的解决方案。我不是在批评您的解决方案,只是指出硬编码引用/索引通常不是好的做法。
    • @vaettchen: jepp,我完全同意
    【解决方案3】:

    上面给出了ifelse问题的答案。 然后根据您的实际应用程序,您也可以通过这种方式进行子集化:

    subset(iris, Species==Species[1])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-30
      • 2015-06-06
      • 2020-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多