[英]Avoiding redundancy when selecting rows in a data frame
我的代碼充滿了以下味道的陳述:
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]
數據幀名稱的重復很繁瑣且容易出錯。 有辦法避免嗎?
你可以用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]
我想到了幾種方法。
如果您考慮一下,就意味着要對數據進行分組。 因此,請使用子集功能(基本程序包):
your_subset <- subset(long_data_frame_name,
col1 == "cond1" & "cond2" == "cond2" & !is.na(col3),
select = selected_columns)
我認為這是完成任務的最“有說服力”的代碼。
使用數據表。
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)]
您有幾種可能性:
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
只會評價你的表達。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.