更改数据框中的特定值

时间:2019-11-16 23:56:48

标签: r

我有以下数据(在数据帧中),它们按每4行分组。

       x        y
1    1.495     0.0
2    1.500    30.0
3    2.500    30.0
4    2.505     0.0
5    8.495     0.0
6    8.500    30.0
7    9.500    30.0
8    9.505     0.0
9   10.495     0.0
10  10.500    30.0
11  11.500    30.0
12  11.505     0.0
13  16.495     0.0 ##From here
14  16.500    30.0
15  17.500    30.0
16  17.505     0.0
17  17.495     0.0
18  17.500    30.0
19  18.500    30.0
20  18.505     0.0 ## End here
21  19.495     0.0
22  19.500    30.0
23  20.500    30.0
24  20.505     0.0
25  23.495     0.0
26  23.500    30.0
27  24.500    30.0
28  24.505     0.0
.
.
.

我试图更改重叠的行的y值(根据其x值)。例如,行(13至16)与行(17至20)重叠。

第13-16行的

x值:16.495 16.500 -------- 17.500 17.505

第17-20行的x值:------------------ 17.495 17.500 ---------- 18.500 18.505

从17.495到17.505有重叠。

我想将“中间”行变成类似以下内容:

13  16.495     0.0 ##From here
14  16.500    30.0
15  17.500    30.0
16  17.505    30.0
17  17.495    30.0
18  17.500    30.0
19  18.500    30.0
20  18.505     0.0 ## End here

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

使用for循环,您可以执行以下操作(假设您的数据帧称为df):

# defining start and end values to process data by group of 4
start = seq(1,length(df$x),by = 4)
end = seq(4,length(df$x),by = 4)

# loop to inspect data by group of 4 and replace data in df in function of the overlap
for(i in 1:(length(start)-1))
{
  if(max(df[start[i]:end[i],"x"]) > min(df[start[i+1]:end[i+1],"x"]))
  {
    df[end[i],"y"] = 30.0
    df[start[i+1],"y"] = 30.0
  }
  else{}
}

您将获得以下数据框:

> df
        x  y
1   1.495  0
2   1.500 30
3   2.500 30
4   2.505  0
5   8.495  0
6   8.500 30
7   9.500 30
8   9.505  0
9  10.495  0
10 10.500 30
11 11.500 30
12 11.505  0
13 16.495  0
14 16.500 30
15 17.500 30
16 17.505 30
17 17.495 30
18 17.500 30
19 18.500 30
20 18.505  0
21 19.495  0
22 19.500 30
23 20.500 30
24 20.505  0
25 23.495  0
26 23.500 30
27 24.500 30
28 24.505  0

答案 1 :(得分:1)

看到当前的样本数据,您似乎想要标识x中的上一个值大于x中的下一个值的行。在这种情况下,第17行就是那个。同样,您要标识x中的值大于x中以下值的行。在这种情况下,第16行就是那个。因此,我尝试通过以下方式获取这些行的行号。请注意,此处的数据称为this.recBuffers[i].push([...e.inputBuffer.getChannelData(i)]);

mydf

这是您指定零件的结果。希望对您有帮助。

ind <- c(which(x = lag(mydf$x) > mydf$x), which(x = lead(mydf$x) < mydf$x))

# Overwrite two specific elements in y
mydf$y[ind] <- 30