![](/img/trans.png)
[英]Replace values in row of a data.frame by values of corresponding row a vector
[英]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
次,等等。 我想做的是在第二列(在此示例中為7
和2
)中獲取一個數字(例如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,你會傾向於使用by
或aggregate
(或split
和sapply
更高級的用法)為同一任務。 例如,要計算組均值,您可以
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.