在dplyr中的函数中使用预先存在的值

在dplyr中的函数中使用预先存在的值,r,dataframe,dplyr,R,Dataframe,Dplyr,问题 我在dplyr中的函数中使用已知值时遇到很多困难。问题在于以下几行。接下来的内容只是导致问题组件的数据 data <- data %>% group_by(Group) %>% bind_cols(as_tibble(rotate2(as.matrix(.)[,1:2], theta = min(.$theta)))) data%变异(Group=rep(1:(n()/42),each=42))%%>%dplyr::Group_by(Group)%%>% 突变(开

问题

我在
dplyr
中的函数中使用已知值时遇到很多困难。问题在于以下几行。接下来的内容只是导致问题组件的数据

data <- data %>%
 group_by(Group) %>% 
 bind_cols(as_tibble(rotate2(as.matrix(.)[,1:2], theta = min(.$theta))))
data%变异(Group=rep(1:(n()/42),each=42))%%>%dplyr::Group_by(Group)%%>%
突变(开始=最小值(!is.na(X)),结束=最大值(!is.na(X)),中点=圆形((开始+结束)/2,数字=0))%>%ungroup()
数据$start\u val\u x填充百分比(c(end\u val\u x,end\u val\u y),.direction=“up”)
data%group\u by(group)%%>%变异(θ=max(atan(c(开始值,结束值))/diff(c(开始值,结束值))),na.rm=T))
data%group\u by(group)%%>%bind\u cols(可旋转(旋转2(旋转矩阵[1:2],θ=min(.$θ)))

我们可以使用
组\u修改
。但是,我不确定下面的结果是否是您想要的

在正常的
dplyr
管道中,我们可以使用
cur_data()
访问每组的数据。这在这里是不可能的,因为我们在一个非dplyr函数中。对于这种情况,我们有
group\u map
(它返回一个列表)和
group\u modify
(它返回一个分组的
tibble
,只要每个输出都是
data.frame
)。我们可以使用lambda函数,这里
.x
是分组数据

库(tidyverse)
图书馆(熔岩)
数据%>%
分组依据(分组)%>%
组修改(~as_tible(旋转2(as.matrix(.x)[,1:2],θ=min(.x$θ)))
#>警告:`as_tible.matrix()`的`x`参数必须具有唯一的列名,如果从tibble 2.0.0起省略了`name_repair`。
#>使用兼容性“.name\u repair”。
#>#A tibble:84 x 3
#>#组:组[2]
#>组V1 V2
#>      
#>1纳纳
#>2 1 NA NA
#>3 1 NA NA
#>4.1纳纳纳
#>51NA
#>61NA
#>7.1纳纳
#>8.1纳纳
#>9.1纳纳纳
#> 10     1  8.26 -7.46
#>#…还有74行

由(v0.3.0)于2021-04-13创建的

如果您只对最后一行有疑问,那么提供当时存在的数据会更简单。您是一个绝对的救生员。这似乎很有效。然后,我只添加了几行,以便将这些数据重新附加到较大的表中(以防万一,这可能对其他人有用):我为您创建的新数据指定了一个名称:
data1
。我删除了
Group
变量(以避免重复),然后将其重新附加到原始数据:
data1$Group
data <- structure(list(X = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, 4.9046, 
6.1424, 7.275, 8.5851, 10.0373, 11.9981, 13.7726, 15.0731, 16.0664, 
18.1945, 21.2666, 24.2093, 26.7119, 28.8037, 30.7135, 32.1351, 
33.1982, 34.2341, 35.7587, 37.2147, 38.4303, 39.625, 40.4596, 
42.0938, 42.7428, 42.7593, 43.5085, 43.7419, 43.5989, 44.0841, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, -14.845, -11.9052, 
-8.7897, -5.8034, -2.6756, 0.3316, 3.4003, 6.5281, 9.6517, 12.804, 
15.9861, 19.1769, 22.2929, 25.4089, 28.3392, 31.0054, 33.1847, 
35.081, 36.7227, 38.1544, 39.1697, 40.049, 40.9647, 41.5014, 
41.8874, 42.1778, 42.3435, 42.2681, 42.3745, 42.4619, NA, NA, 
NA, NA), Y = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, -9.9938, -7.4596, 
-4.8647, -2.2903, 0.3158, 2.9302, 5.7262, 8.7033, 11.8007, 14.9847, 
16.7225, 16.7813, 15.6921, 14.2964, 11.5579, 8.2378, 5.183, 1.5938, 
-2.0712, -5.195, -7.1447, -9.0446, -11.1269, -13.0979, -15.3295, 
-17.1898, -19.4376, -21.4781, -23.8426, -25.6343, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, 8.0113, 9.1826, 9.838, 10.7908, 
11.175, 12.0393, 12.6813, 12.8828, 13.2281, 13.5102, 13.6637, 
13.5493, 12.8699, 12.2191, 10.9208, 9.0209, 6.2158, 3.2466, 0.2169, 
-2.7807, -6.0439, -9.1262, -11.8684, -14.7779, -17.5825, -20.2452, 
-22.807, -25.3519, -27.6105, -29.7536, NA, NA, NA, NA), fan_line = c(1L, 
2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 
16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 
29L, 30L, 31L, 32L, 33L, 34L, 35L, 36L, 37L, 38L, 39L, 40L, 41L, 
42L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 
14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 
27L, 28L, 29L, 30L, 31L, 32L, 33L, 34L, 35L, 36L, 37L, 38L, 39L, 
40L, 41L, 42L)), class = "data.frame", row.names = c(NA, -84L
))
data <- data %>% mutate(Group = rep(1:(n()/42), each = 42)) %>% dplyr::group_by(Group) %>% 
  mutate(start = min(which(!is.na(X))), end = max(which(!is.na(X))), midpoint = round((start+end)/2, digits = 0)) %>% ungroup()

data$start_val_x <- 0
data$end_val_x <- 0
data$start_val_y <- 0
data$end_val_y <- 0


for (i in 1:nrow(data)){
  if (data[i, "fan_line"] == data[i, "start"]){
    data[i, "start_val_x"] = data[i, "X"]
    data[i, "start_val_y"] = data[i, "Y"]
  }
  else{data[i, "start_val_y"] = NA
  data[i, "start_val_x"] = NA}
}

for (i in 1:nrow(data)){
  if (data[i, "fan_line"] == data[i, "end"]){
    data[i, "end_val_x"] = data[i, "X"]
    data[i, "end_val_y"] = data[i, "Y"]
  }
  else{data[i, "end_val_y"] = NA
  data[i, "end_val_x"] = NA}
}

data <- data %>%  group_by(Group) %>% fill(c(start_val_x, start_val_y), .direction = "down") %>% fill(c(start_val_x, start_val_y), .direction = "up")
data <- data %>%  group_by(Group) %>% fill(c(end_val_x, end_val_y), .direction = "down") %>% fill(c(end_val_x, end_val_y), .direction = "up")
data <- data %>% group_by(Group) %>% mutate(theta = max(atan(diff(c(start_val_y, end_val_y))/diff(c(start_val_x, end_val_x))), na.rm = T))
data <- data %>% group_by(Group) %>% bind_cols(as_tibble(rotate2(as.matrix(.)[,1:2], theta = min(.$theta))))