在数据框中选择行时避免冗余

时间:2013-11-20 10:40:55

标签: r

我的代码中充斥着以下品味的陈述:

selected <- long_data_frame_name[long_data_frame_name$col1 == "condition1" & 
long_data_frame_name$col2 == "condition2" & !is.na(long_data_frame_name$col3),
selected_columns]

重复数据框名称是繁琐且容易出错的。有没有办法避免它?

4 个答案:

答案 0 :(得分:3)

您可以使用with

例如

sel.ID <- with(long_data_frame_name, col1==2 & col2<0.5 & col3>0.2)
selected <- long_data_frame_name[sel.ID, selected_columns]

答案 1 :(得分:2)

想到几种方法。

如果你考虑一下,你就是数据的子集。因此使用子集函数(基础包):

your_subset <- subset(long_data_frame_name,
                      col1 == "cond1" & "cond2" == "cond2" & !is.na(col3),
                      select = selected_columns)

在我看来,这是完成任务的最“说话”的代码。

答案 2 :(得分:2)

使用数据表。

library(data.table)
long_data_table_name = data.table(long_data_frame_name, key="col1,col2,col3")
selected <- long_data_table_name[col1 == "condition1" & 
                                 col2 == "condition2" & 
                                 !is.na(col3),
                                 list(col4,col5,col6,col7)]

您不必在data.table(...)调用中设置密钥,但如果您拥有大型数据集,则会更快更多。无论哪种方式,它都比使用数据帧快得多。最后,使用J(...),如下所示,确实需要键控data.table,但速度更快。

selected <- long_data_table_name[J("condition1","condition2",NA),
                                 list(col4,col5,col6,col7)]

答案 3 :(得分:1)

您有几种可能性:

  • attach将data.frame的变量添加到全局环境下方的搜索路径中。对于代码演示非常有用,但我警告你不要以编程方式执行此操作。

  • with创造了一个全新的环境temporarilly。

在非常有限的情况下,您希望使用其他选项,例如within

df = data.frame(random=runif(100))
df1 = with(df,log(random))
df2 = within(df,logRandom <- log(random))

within将在评估后检查创建的环境,并将修改添加到数据中。查看with的帮助以查看更多示例。 with只会评估你的表达方式。