从data.frame获取相应的值

从data.frame获取相应的值,r,dataframe,R,Dataframe,我的问题是,我无法用文字表达我的问题,这使得谷歌很难找到它,所以我不得不问你。我希望你能阐明我的问题: 我得到了这样一个数据帧: 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多行,我不能真正使用它。你们有好办法吗 关于

我的问题是,我无法用文字表达我的问题,这使得谷歌很难找到它,所以我不得不问你。我希望你能阐明我的问题:

我得到了这样一个数据帧:

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))

这里有一个使用dplyr的解决方案

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

首先,你建议的解决方案到底有什么问题?这是效率问题吗?坦率地说,您提供的代码接近最优[1]

对于一般情况,您可能会看到一个拆分-应用-组合操作,根据某种差异将函数应用于数据子集。正如@teucer所指出的,
dplyr
(以及它的祖先,
plyr
)正是为此而设计的,就像
数据表一样。在vanilla R中,您倾向于使用
by
aggregate
(或
split
sapply
进行更高级的使用)来完成相同的任务。例如,要计算组的意思,您可以

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

甚至

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

[1] 代码可以简化为
df$V2[df$V1==0]
df[df$V1==0,]

首先,您建议的解决方案到底有什么问题?这是效率问题吗?坦率地说,您提供的代码接近最优[1]

对于一般情况,您可能会看到一个拆分-应用-组合操作,根据某种差异将函数应用于数据子集。正如@teucer所指出的,
dplyr
(以及它的祖先,
plyr
)正是为此而设计的,就像
数据表一样。在vanilla R中,您倾向于使用
by
aggregate
(或
split
sapply
进行更高级的使用)来完成相同的任务。例如,要计算组的意思,您可以

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

甚至

sapply(split(df$V2, df$V1), mean)
[1] 代码可以简化为
df$V2[df$V1==0]
df[df$V1==0,]

使用您的数据(附带一些临时名称)

(例如:

)或者使用默认接口

aggregate(Var2 ~ Var1, data = df, mean)
aggregate(Var2 ~ Var1, data = df, max)
aggregate(Var2 ~ Var1, data = df, min)
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
但是公式界面的输出更好。

使用您的数据(附带一些临时名称)

(例如:

)或者使用默认接口

aggregate(Var2 ~ Var1, data = df, mean)
aggregate(Var2 ~ Var1, data = df, max)
aggregate(Var2 ~ Var1, data = df, min)
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

但是公式界面的输出更好。

谢谢大家的回复。我决定采用teucer和eipi10发布的
dplyr
解决方案。由于我有第三列(甚至第四列),这个解决方案似乎很容易使用(只需将
V3
添加到
groupby


因为有些人问df$V2[哪个(df$V1==0)]有什么问题:我说“行”的时候可能有点不清楚,我的意思是“值”吗。假设我在第一列中有
n
不同的值,我必须对所有不同的值使用
n
次命令,并存储
n
结果向量。

谢谢大家的回复。我决定采用teucer和eipi10发布的
dplyr
解决方案。由于我有第三列(甚至第四列),这个解决方案似乎很容易使用(只需将
V3
添加到
groupby


因为有些人问df$V2[哪个(df$V1==0)]有什么问题:我说“行”的时候可能有点不清楚,我的意思是“值”吗。让我们假设我在第一列中有
n
不同的值,我必须对所有不同的值使用
n
次命令,并存储
n
结果向量。

使用
数据。table

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

使用
数据表

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

库(dplyr);df%>%groupby(V1)%>%summary(mean=mean(V2)、max=max(V2)、min=min(V2))
将为您提供与
V1
的每个值相对应的
V2
中的值的平均值、最小值和最大值。为什么您不能将函数用于此?
库(dplyr);df%>%groupby(V1)%>%summary(mean=mean(V2)、max=max(V2)、min=min(V2))
将为您提供与
V1
的每个值对应的
V2
中的值的平均值、最小值和最大值。您为什么不能使用此函数呢?感谢您的快速操作和关于
dplyr
软件包的提示!我不知道这个非常强大的软件包。像施了魔法一样解决了我的问题。谢谢感谢您对
dplyr
软件包的快速提示!我不知道这个非常强大的软件包。像施了魔法一样解决了我的问题。谢谢