使用循环或lapply执行此任务的问题

时间:2017-08-19 21:06:17

标签: r for-loop data.table lapply

我已经采用了一组文本,并将其拆分为我关注的6个元素('标题','已发布',' authors', ' country',' journal',' url')。每个引文应该包含其中的每一个,但缺少数据。我分配了一个' varnum'变量到每个元素,所以我可以通过它们找出我缺少值的位置。我计划创建一个引用变量(' citenum')并循环(或lapply),并且只在“citenum”中创建一个变化'当有一个从预期的转变。我决定创建两个变量' con'和' prev_con'所以我可以做一些简单的数学运算来确定何时应该有一个增量(一个)用于' citenum'。最终,我想创建一个矩阵来显示每个引文的缺失值。如果你可以帮助循环或lapply ...我会很感激。

citation <- as.data.frame(cbind(prev_con, con, citenum, varnum))

library(data.table)
citationDT <- as.data.table(citation)
citationDT <- citationDT[, prev_con := shift(con)]
citation <- as.data.frame(citationDT)
citation[1,1] <- 99
head(citation, 20)

prev_con    con  citenum    varnum
99           11     0         1
11           12     0         2
12           14     0         4
14           10     0         0
10           10     0         0
10           16     0         6
16           16     0         6
11           11     0         1
12           12     0         2

&#39; con&#39;通过在“varnum”中添加10来创建变量。所以我可以更容易地找到我需要将Citenum增加到下一个级别的地方。使用data.table创建Prevcon以转换到先前的con结果。

这是我尝试过的 - 最终使得citenum等于最终行号6244。

for (i in 1:length(citation$citenum)){
  if (citation$con[i] <= citation$prev_con) {
    citation$citenum <- citation$citenum[i] + 1
    } else {citation$citenum <- citation$citenum[i]
  }
}

提前感谢您的帮助。

---从原始提交编辑----

我希望得到以下内容:

       prev_con con citenum varnum
1        99  11       1      1
2        11  12       1      2
3        12  14       1      4
4        14  10       2      0
5        10  10       3      0
6        10  16       3      6
7        16  16       4      6
8        16  11       5      1
9        11  12       5      2
10       12  13       5      3

1 个答案:

答案 0 :(得分:0)

您忘记在for循环的几个位置编入索引。希望这能为您解决这个问题。

for (i in 1:nrow(citation)){
    if (citation$con[i] <= citation$prev_con[i]) {
        if (i==1) citation$citenum[i] <- 1
        else citation$citenum[i] <- citation$citenum[i-1] + 1
    } 
    else {
        citation$citenum[i] <- citation$citenum[i-1]
    }
}

编辑:另外,我们需要添加到前一行的元素,即i-1的位置.if(i == 1)是一个极端情况,因为没有i = 0。< / p>