簡體   English   中英

在數據框中選擇行時避免冗余

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM