簡體   English   中英

從data.frame獲取相應的值

[英]Getting corresponding values from data.frame

我的問題是我真的無法用言語來解決我的問題,這使它很難用谷歌搜索,所以我被迫問你。 希望您能闡明我的問題:

我有一個像這樣的data.frame:

6 4
5 2
3 6
0 7
0 2
1 3
6 0
1 1

正如您所注意到的,在第一列中,我得到0重復兩次,重復1次,等等。 我想做的是在第二列(在此示例中為72 )中獲取一個數字(例如0所有對應值。 最好在data.frame

我知道使用df$V2[which(df$V1==0)]的嘗試,但是由於第一列可能有100多行,所以我不能真正使用它。 你們有很好的解決方案嗎?

關於這個問題的背景,也許有些話:我需要處理此數據,即獲取第一列中所有0的第二列的平均值,或獲取最小值/最大值。

問候

這是使用dplyr的解決方案

df %>% group_by(V1) %>% summarize(ME=mean(V2))

使用數據(附加一些臨時名稱)

txt <- "6 4
5 2
3 6
0 7
0 2
1 3
6 0
1 1"
df <- read.table(text = txt)
names(df) <- paste0("Var", seq_len(ncol(df)))

強迫第一列成為一個因素

df <- transform(df, Var1 = factor(Var1))

然后,您可以將aggregate()與漂亮的公式接口配合使用

aggregate(Var2 ~ Var1, data = df, mean)
aggregate(Var2 ~ Var1, data = df, max)
aggregate(Var2 ~ Var1, data = df, min)

(例如:

> aggregate(Var2 ~ Var1, data = df, mean)
  Var1 Var2
1    0  4.5
2    1  2.0
3    3  6.0
4    5  2.0
5    6  2.0

)或使用默認界面

with(df, aggregate(Var2, list(Var1), FUN = mean))

> with(df, aggregate(Var2, list(Var1), FUN = mean))
  Group.1   x
1       0 4.5
2       1 2.0
3       3 6.0
4       5 2.0
5       6 2.0

但是從公式界面輸出的效果更好。

使用data.table

library(data.table)
setDT(df)[, list(mean=mean(V2), max= max(V2), min=min(V2)), by = V1]

首先,您建議的解決方案到底出了什么問題? 這是效率的問題嗎? 坦白說,您提供的代碼已接近最佳[1]。

對於一般情況,您可能正在看一個split-apply-combine動作,以便根據某些差異將函數應用於數據子集。 正如@teucer所指出的那樣, dplyr (及其祖先plyr )正是為此而設計的, plyr也是data.tables 在香草R,你會傾向於使用byaggregate (或splitsapply更高級的用法)為同一任務。 例如,要計算組均值,您可以

by(df$V2, df$V1, mean)

要么

aggregate(df, list(type=df$V1), mean)

甚至

sapply(split(df$V2, df$V1), mean)

[1]代碼也可以簡化為df$V2[df$V1 == 0]df[df$V1 == 0,]

感謝大家的答復。 我決定采用teucer和eipi10發布的dplyr解決方案。 由於我有第三列(甚至第四列),因此該解決方案似乎非常易於使用(只需將V3添加到group_by )。

由於有人問df$V2[which(df$V1==0)]是怎么回事:我說“行”時可能有點不清楚,實際上我是說“值”。 假設我在第一列中有n不同的值,那么我將必須對所有不同的值使用n次命令,並存儲n結果向量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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