【问题标题】:R, for loop on data frame column and need value from an otherR,数据框列上的for循环,需要另一个值
【发布时间】:2017-02-18 06:23:44
【问题描述】:

我有以下类型的数据框:

   Gender FSIQ VIQ PIQ Weight Height MRIcount IQindicator
1  Female  133 132 124    118   64.5   816932           1
2    Male  140 150 124     NA   72.5  1001121           1
3    Male  139 123 150    143   73.3  1038437           1
4    Male  133 129 128    172   68.8   965353           1
5  Female  137 132 134    147   65.0   951545           1
6  Female   99  90 110    146   69.0   928799           0

我的目标是制作 2 个向量,一个具有 MRIcount 的 IQindicator 为 1,另一个 IQindicator 为 0

我写了以下内容:

MRI_low <-c()
MRI_high <- c()
for (index in brain_data[,8]){
  if (index = 1){
    MRI_high <- append(MRI_high, MRIcount)
  } else {
    MRI_low <- append(MRI_low, MRIcount)
  }
}

我怎样才能做到这一点?

对于这个例子,我需要:

> MRI_low <-c(928799) MRI_high <-c(816932, 1001121, 1038437, 965353,
> 951545)

【问题讨论】:

    标签: r if-statement for-loop dataframe


    【解决方案1】:

    您可以只使用逻辑索引。假设您的数据框的名称是 df,一种解决方案可能是

    MRI_high <- df$MRIcount[df$IQindicator == 1]
    MRI_low  <- df$MRIcount[df$IQindicator == 0]
    

    使用 $ 运算符,您可以访问/提取数据框的变量。然后,您会在括号中看到逻辑条件。这会生成一个由 TRUE 组成的向量,其中所述条件成立,如果不成立,则为 FALSE。如果使用逻辑向量索引向量,则将值保留为 TRUE。

    【讨论】:

    • 你的版本和 $jdobres 版本的根本区别是什么
    • jdobres 的回答类似。不同之处仅在于他使用函数子集,而我只使用纯逻辑条件。我认为对于大型数据集,我的解决方案可能会更快一些,因为我不需要函数调用。
    【解决方案2】:

    假设您的数据框名为df,这将起作用:

    MRI_low <- subset(df, IQindicator == 0)$MRIcount
    MRI_high <- subset(df, IQindicator == 1)$MRIcount
    

    使用一些额外的包有更优雅的方法,但这对于基本安装应该足够了。

    【讨论】:

    • 这与 $stats_guy awnser 有何不同
    • 我的使用subset(),而 stats_guy 使用逻辑索引。这两个答案是等价的。
    猜你喜欢
    • 2011-09-07
    • 2020-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 2019-06-14
    • 2020-05-22
    相关资源
    最近更新 更多