【问题标题】:Problems using loops or lapply for this task使用循环或 lapply 执行此任务时出现问题
【发布时间】:2017-08-19 21:06:17
【问题描述】:

我已经获取了一个文本语料库,并将其分成我关心的 6 个元素的行('title'、'published'、'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

“con”变量是通过将 10 添加到“varnum”来创建的,因此我可以更轻松地找到需要将 citenum 增加到下一个级别的位置。 Prevcon 是使用 data.table 创建的,以转移到上一个 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

【问题讨论】:

    标签: r for-loop data.table lapply


    【解决方案1】:

    您忘记在 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。

    【讨论】:

    • 您的答案中需要else 吗?
    • 完全没有,我只是从他的代码中复制过来的。谢谢你。
    • 我添加了我想要的。您共享的代码没有得到我想要的结果。我希望它从 1 变为 n(在本例中为 6244)。请参阅我在上面编辑的示例。感谢您的帮助。
    • 哦,我明白了。我正在使用固定循环编辑答案。
    • 太棒了!!那工作得很好。感谢您的宝贵时间。
    猜你喜欢
    • 1970-01-01
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    • 2021-11-05
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    相关资源
    最近更新 更多