R语言 计算网格中每个“单元格”中的数据点数量

yyyllmsg  于 2023-09-27  发布在  其他
关注(0)|答案(2)|浏览(122)

我有一个三列的数据框,Subject,Rt 1和Rt 2。

df<-data.frame(Subject = c(rep(1,15), rep(2,15)), RT1=rep(seq(100,1500,100),2), RT2 = rep(seq(200,3000,200),2))

出于各种原因,我想计算每个主题的4*4网格中每个单元格上的数据点的数量/频率。这里,2名受试者的数据点相同,但实际数据并非如此。
例如,假设我的网格的值是:

x_axis <- c(220, 350, 700, 1250, 1800)
y_axis <- c(100, 700, 1400, 2500, 3500)

所以基本上我只是想得到一些东西,返回上面网格中每个单元格中的点数,期望输出如下:

df2<-data.frame("<x1"= c(1,0,0,0,0),
                "x1-x2"= c(0,2,0,0,0),
                "x2-x3"= c(0,0,4,0,0),
                "x4-x5"= c(0,0,0,3,0)
                )

请注意,这个例子只针对一个主题(为清楚起见)
我知道如何做到这一点,只需计算每个“案例”中的点数,如:

df%>%
  group_by(Subject)%>%
  count(between(df$RT1,0,180),between(df$RT2 ,0,210))%>%
  set_names(c("RT1","RT2","n"))%>%
  filter(if_all(RT1:RT2, ~ . %in% TRUE))

然而,这是非常低效的,因为我应该为所有条件的每个单元格粘贴此代码。
我也有一个使用表和切的解决方案,但我不知道如何用这种方法按主题分组:

table(
  cut(df$RT2, c(0, y_axis), right = FALSE),
  cut(df$RT1, c(0, x_axis), right = FALSE)
)

我真的很感激你的帮助,
谢谢你,
卢卡斯

nkhmeac6

nkhmeac61#

步骤:
1.根据x_axisy_axis中设置的切片,使用cut()函数将RT1RT2分成多个组
1.获取我们刚刚创建的每个x和y组的计数。

out <- df |> 
  mutate(x = cut(RT1, c(0, x_axis), labels = x_axis),
            y = cut(RT2, y_axis, labels = y_axis[-1])) |>
            count(x, y)

输出量:

x    y  n
1  220  700  4
2  350  700  2
3  700 1400  8
4 1250 2500 10
5 1800 3500  6

如果你坚持使用更宽的格式(尽管这样存储数据是不整洁/不好的做法,而且零只会增加更多的混乱),你可以使用pivot_wider()

out |> pivot_wider(names_from= y, values_from = n, values_fill = 0)

输出量:

# A tibble: 5 × 5
  x     `700` `1400` `2500` `3500`
  <fct> <int>  <int>  <int>  <int>
1 220       4      0      0      0
2 350       2      0      0      0
3 700       0      8      0      0
4 1250      0      0     10      0
5 1800      0      0      0      6

备注:

  • 我的表与你的表略有不同,因为看起来你的y轴上的切割与你的截图(大概是你的输出)中的切割略有不同。最小的一个在输入中是100,但在图中它大约是220。
9udxz4iz

9udxz4iz2#

你的问题不够清楚,因为你选择的例子有很多巧合,可能会导致误解。

  • 2列,不包括主题(RT1RT1)。2个用于比较的向量(x_axisy_axis)。df中的2例受试者。他们之间有什么联系吗?
  • df2中,每一行都表示在一个范围内的个体的数量(频率),但这没有太大的意义,因为1个数字只会被归类在1个范围内,所以df2中的零表示我认为很明显的东西。
  • 为什么你没有考虑df2中的范围x3-x4,我可以假设这是一个错误,但在你的例子中,这是一个有更多个体的范围。

因此,假设存在对应关系:RT1-x_axisRT2-y_axis,我可以建议下一个解决方案。我可以改进它,但需要你给予我们一个更好的例子或解释。

mapply(x = df[,2:3], breaks = list(x_axis = x_axis, y_axis = y_axis), 
       FUN = \(x, breaks) cut(x = x, breaks = c(-Inf, breaks, Inf)), 
       SIMPLIFY = FALSE) |> 
  
  lapply(\(x) table(df$Subject, x))

在输出中,每列是一个范围(考虑到假定的对应关系),每行是一个主题。

相关问题