我的代码中充斥着以下品味的陈述:
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]
重复数据框名称是繁琐且容易出错的。有没有办法避免它?
答案 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
只会评估你的表达方式。