如何为数据帧中的每个组运行for循环?
这个问题类似于但不完全相同。我想遍历一个大数据集(~500000行),对于一列中的每个唯一值,我想对另一列中的所有值进行一些处理 以下是我已确认有效的代码:如何为数据帧中的每个组运行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值 假设我有这样的数据
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
循环。只需应用一个函数(每组)
样本数据
dfAbase 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
的目的!或者在基本Rave(数据$value,数据$ID,一些函数)
!我认为您需要阅读一些基本的R数据转换概念:例如,dplyr
方法,或者在基本Rave
、tapply
、by
等等。@InterLinkedgroup_by
是dplyr
的一部分;因此,您需要加载库。或者更好的方法是使用库(tidyverse)
(参见上面的代码)。不管怎样。我认为我们在这方面没有任何进展,我已经没有办法和时间来表达你需要提供什么,以便其他人提供帮助。也许有人能接。祝你好运。@InterLinked看看我的示例代码!它是完全可复制的,应该让您开始使用。@InterLinkeddf
必须是一个数据。帧
,而不是矩阵
。如有必要,使用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))