如何为数据帧中的每个组运行for循环?

如何为数据帧中的每个组运行for循环?,r,for-loop,R,For Loop,这个问题类似于但不完全相同。我想遍历一个大数据集(~500000行),对于一列中的每个唯一值,我想对另一列中的所有值进行一些处理 以下是我已确认有效的代码: df = matrix(nrow=783,ncol=2) counts = table(csvdata$value) p = (as.vector(counts))/length(csvdata$value) D = 1 - sum(p**2) 唯一的问题是它返回整个数据集的D值,而不是为ID相同的每组行返回单独的D值 假设我有这样的数据

这个问题类似于但不完全相同。我想遍历一个大数据集(~500000行),对于一列中的每个唯一值,我想对另一列中的所有值进行一些处理

以下是我已确认有效的代码:

df = matrix(nrow=783,ncol=2)
counts = table(csvdata$value)
p = (as.vector(counts))/length(csvdata$value)
D = 1 - sum(p**2)
唯一的问题是它返回整个数据集的
D
值,而不是为
ID
相同的每组行返回单独的
D

假设我有这样的数据:

我如何才能执行与上面代码相同的操作,但为
ID
相同的每组行返回一个D值,而不是为整个数据集返回?我想这需要一个循环,并创建一个矩阵来存储所有D值,其中一列中包含
ID
,另一列中包含
D
,但不确定。

好的,让我们使用“简言之,我希望for循环中的任何内容都以唯一的“ID”值为每个数据块执行

通常,您可以按一列中的值(例如,
“ID”
)对行进行分组,然后根据每组中其他列中的值/条目执行一些转换。在
tidyverse
中,这将如下所示

library(tidyverse)
df %>%
    group_by(ID) %>%
    mutate(value.mean = mean(value))
## A tibble: 8 x 3
## Groups:   ID [3]
#  ID    value value.mean
#  <fct> <int>      <dbl>
#1 a        13       12.6
#2 a        14       12.6
#3 a        12       12.6
#4 a        13       12.6
#5 a        11       12.6
#6 b        12       15.5
#7 b        19       15.5
#8 cc4      10       10.0
使用
tapply
ave
by
中的一种,在基本R中也可以实现同样的效果。据我所知,您的问题陈述不需要
for
循环。只需应用一个函数(每组)


样本数据
dfA
base R
选项为

df1$value.mean <- with(df1, ave(value, ID))

df1$value.mean请编辑您的代码,通过包含样本数据使您的示例重现。首先,
df您还没有提供示例数据。请回顾如何提供,包括样本数据。如果您不提供这些详细信息,我们将无能为力。“数据不重要”样本数据总是重要的!请记住,您向那些不知道您一直在做什么、正在尝试做什么以及正在处理哪些数据的人寻求帮助。这就是为什么MCVE在请求调试帮助时是一个关键组件。您的代码示例仍然不可复制。例如,循环中的
i
没有在任何地方定义。“它不是自动定义为“For each”(即“For i in 1:9”)将循环运行9次吗?”您认为
i
是“自动”定义的吗?没有“自动”定义的变量。在
for(i In 1:9)
中定义
i
;在你的情况下,你没有。我认为我们错过了彼此的要点。对于提供reprex/MCVE意味着什么,似乎存在误解。我很乐意提供帮助,但我不知道您想做什么:我无法使用您的代码,因为您的示例/问题不可复制。我不明白逻辑,因为你没有提供任何细节。我不知道你想要实现什么,因为你没有提供你的预期输出。这三个缺点的结合使得很难(不可能)提供帮助。@InterLinked什么是
a
b
?它们是未定义的。对于
循环,绝对不需要显式的
。@InterLinked???如果您
df%>%group\u by(ID)%>%mutate(new\u val=some\u function(value))
您“获取具有该ID的行的所有“value”条目”。这正是
groupby
+
mutate
的目的!或者在基本R
ave(数据$value,数据$ID,一些函数)
!我认为您需要阅读一些基本的R数据转换概念:例如,
dplyr
方法,或者在基本R
ave
tapply
by
等等。@InterLinked
group_by
dplyr
的一部分;因此,您需要加载库。或者更好的方法是使用
库(tidyverse)
(参见上面的代码)。不管怎样。我认为我们在这方面没有任何进展,我已经没有办法和时间来表达你需要提供什么,以便其他人提供帮助。也许有人能接。祝你好运。@InterLinked看看我的示例代码!它是完全可复制的,应该让您开始使用。@InterLinked
df
必须是一个
数据。帧
,而不是
矩阵
。如有必要,使用
as.data.frame
转换为
data.frame
。请参阅我的示例中的可复制数据。这就是为什么MCVE包含示例数据(不是屏幕截图,而是通过
dput
提供的;它们都在我之前给您的链接中;-)
df <- read.table(text =
    "ID value
a 13
a 14
a 12
a 13
a 11
b 12
b 19
cc4 10", header = T)
# Sample data
set.seed(2017)
csvdata <- data.frame(
    microsat = rep(c("A", "B", "C"), each = 8),
    allele = sample(20, 3 * 8, replace = T))

csvdata %>%
    group_by(microsat) %>%
    summarise(D = 1 - sum(prop.table(table(allele))^2))
## A tibble: 3 x 2
#  microsat     D
#  <fct>    <dbl>
#1 A        0.844
#2 B        0.812
#3 C        0.812
df1$value.mean <- with(df1, ave(value, ID))