重新排列列值小于x的数据帧的行

朱利安·纳瓦拉(Julien Navarre)

我有这个数据框:

> df
    Z freq        proba
1  17    1 0.0033289263
2  18    4 0.0055569026
3  19    2 0.0087878028
4  20    3 0.0132023556
5  21   16 0.0188900561
6  22   12 0.0257995234
7  23   30 0.0337042731
8  24   41 0.0421963455
9  25   56 0.0507149437
10 26   65 0.0586089198
11 27   65 0.0652230449
12 28   93 0.0699913154
13 29   82 0.0725182432
14 30   94 0.0726318551
15 31   72 0.0703990113
16 32   74 0.0661024717
17 33   58 0.0601873020
18 34   66 0.0531896431
19 35   38 0.0456625487
20 36   45 0.0381117389
21 37   27 0.0309498221
22 38   17 0.0244723502
23 39   15 0.0188543771
24 40   13 0.0141629367
25 41    4 0.0103793600
26 42    1 0.0074254435
27 43    2 0.0051886582
28 45    1 0.0023658767
29 46    1 0.0015453804
30 49    2 0.0003792308

# Here are my datas :
> dput(df)
structure(list(Z = c(17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 
27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 
43, 45, 46, 49), freq = c(1, 4, 2, 3, 16, 12, 30, 41, 56, 65, 
65, 93, 82, 94, 72, 74, 58, 66, 38, 45, 27, 17, 15, 13, 4, 1, 
2, 1, 1, 2), proba = c(0.0033289262662263, 0.00555690264007235, 
0.00878780282243439, 0.0132023555702843, 0.0188900560866825, 
0.0257995234198431, 0.0337042730520012, 0.0421963455163949, 0.0507149437492447, 
0.0586089198012906, 0.0652230449359029, 0.0699913153996099, 0.0725182432348992, 
0.0726318551493006, 0.0703990113442269, 0.0661024716831246, 0.0601873020200862, 
0.0531896430528685, 0.045662548708844, 0.0381117389181843, 0.030949822142559, 
0.0244723501557229, 0.01885437705459, 0.0141629366839816, 0.0103793599644779, 
0.00742544354411115, 0.00518865818999788, 0.00236587669133322, 
0.00154538036835848, 0.000379230768851682)), .Names = c("Z", 
"freq", "proba"), row.names = c(NA, -30L), class = "data.frame")

我想用下一行重新组合值“ freq”小于5的行,而下一行小于5的行。如果我足够清楚,则为Idk,所以这是我期望的输出:

> df2
   labels effectifs         pi
1   17;20        10 0.03087599
2      21        16 0.01889006
3      22        12 0.02579952
4      23        30 0.03370427
5      24        41 0.04219635
6      25        56 0.05071494
7      26        65 0.05860892
8      27        65 0.06522304
9      28        93 0.06999132
10     29        82 0.07251824
11     30        94 0.07263186
12     31        72 0.07039901
13     32        74 0.06610247
14     33        58 0.06018730
15     34        66 0.05318964
16     35        38 0.04566255
17     36        45 0.03811174
18     37        27 0.03094982
19     38        17 0.02447235
20     39        15 0.01885438
21     40        13 0.01416294
22  41;49        11 0.02728395

我使用nested做到了while,但是我发现此解决方案非常痛苦且未优化。

i <- 1
freqs <- c()
labels <- c()
pi <- c()
while(i < nrow(df)) {
  if (df$freq[i] >= 5) {
    freqs <- c(freqs, df$freq[i])
    labels <- c(labels, df$Z[i])
    pi <- c(pi, df$proba[i])
    i <- i + 1
  }
  else {
    count <- df$freq[i]
    countPi <- df$proba[i]
    k <- i
    j <- i
    while(df$freq[i] < 5 & i < nrow(df)) {
      if (df$freq[i+1] < 5) {
        count <- count + df$freq[i+1]
        countPi <- countPi + df$proba[i+1]
        j <- i + 1
      }
      i <- i + 1
    }
    labels <- c(labels, paste0(df$Z[k], ";", df$Z[j]))
    freqs <- c(freqs, count)
    pi <- c(pi, countPi)
  }
}

df2 <- data.frame(labels, freqs, pi)

我敢肯定,也许还有dplyr会更好。如果您有更好的解决方案..谢谢!

阿克伦

引入新功能后,我们可以使用“ data.table”的“ devel”版本rleid在这里,我们将“ data.frame”转换为“ data.table”(setDT(df)),并使用逻辑索引(freq <5创建一个分组变量(“ gr”)rleid“ Z”列是“数字/整数”类。从“ Z”创建一个字符列(“ Z1”)。按“ gr”分组,如果该组中所有元素的“频率”均小于5,则通过对列(.SD[1L]的首次观察将​​行汇总为单个行,并删除不需要的列(因为.SD包括“ Z1”(这将导致重复的列),并在其后附加我们粘贴该组的“ Z”minmax值“ Z1”。else .SD否则,请使其保持不变( )。通过将其分配给“ NULL”来删除不需要的列。

library(data.table) #data.table_1.9.5
res <- setDT(df)[, gr:=rleid(freq<5)][, Z1:= as.character(Z)][, 
        if(all(freq<5)) c(.SD[1L][,-4, with=FALSE], 
          list(Z1=toString(c(min(Z), max(Z)))))
      else .SD, gr][,1:2 :=NULL][]
head(res,3)
#   freq       proba     Z1
#1:    1 0.003328926 17, 20
#2:   16 0.018890056     21
#3:   12 0.025799523     22

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Pandas:拆分数据帧行并重新排列列值

来自分类Dev

熊猫重新排列数据帧,以使每列的所有值均按升序独立

来自分类Dev

如何重新排列R数据帧中不同列中的值

来自分类Dev

R:将单列数据帧的特定行重新排列为新列

来自分类Dev

重新排列数据行

来自分类Dev

R数据帧重新排列

来自分类Dev

在R中重新排列数据帧

来自分类Dev

重新排列数据帧以计算ICC

来自分类Dev

重新排列数据帧结构

来自分类Dev

如果一次出现列值,则MySQL重新排列/重新排列行位置

来自分类Dev

如何重新排列数据框中的两列,以使行值在R中匹配?

来自分类Dev

Pandas 数据框 - 将行索引值重新排列为列标题

来自分类Dev

熊猫将数据重新排列为相同值的列

来自分类Dev

熊猫将数据重新排列为相同值的列

来自分类Dev

Excel 中的数据整理 - 重新排列列和行

来自分类Dev

从数据透视表重新排列值

来自分类Dev

重新排列数据框上的行

来自分类Dev

通过匹配列重新排列数据

来自分类Dev

从R中的数据帧重新排列信息

来自分类Dev

如何在R中重新排列数据帧

来自分类Dev

r:根据时间重新排列数据帧

来自分类Dev

为 keras cnn 重新排列数据帧行内容

来自分类Dev

R重新排列数据框:将某些行转换为列

来自分类Dev

R重新排列数据框:将某些行转换为列

来自分类Dev

将数据从一列重新排列到一行

来自分类Dev

重新排列纵向数据

来自分类Dev

重新排列CSV数据

来自分类Dev

重新排列数据框?

来自分类Dev

重新排列纵向数据