【问题标题】:Using string for dplyr filter and for loop将字符串用于 dplyr 过滤器和 for 循环
【发布时间】:2018-08-12 15:46:04
【问题描述】:

我有一个数据集,其中包含人员 ID(人员)列表、每个人使用的一些语言特征,以及他们使用这些特征的次数。它看起来像这样:

df <- data.frame(PID = c(1, 1, 2, 2, 2, 3, 3), Feature = c("F2", "F3", "F1", "F2", "F3", "F1", "F3"), Freq = c(2, 1, 3, 1, 2, 4, 3))

ids <- data.frame(PID = 1:3, Level = c("low", "mid", "high"))

我正在将它转换成一个数据框,每行有一个人,语言特征作为列:

f_freq <- data.frame(ids[1:2], matrix(nrow = nrow(ids), ncol = 3))
f_names <- c("F1", "F2", "F3) 
names(f_freq)[3:5] <- f_names 

所以我想将第一个数据帧 (df) 的频率信息映射到新的数据帧 (f_freq),并且还为每个人没有使用的特征插入 0。我写了一个for循环来达到这个目的:

for (h in 1:length(f_names)) {
    for (j in 1:nrow(f_freq)) {
        t1 <- filter(df, Feature == f_names[[h]])
        if (f_freq$PID[j] %in% t1$PID) {
            f_freq[j, f_names[[h]]] <- t1[t1$PID == f_freq$ID[j], "Freq"]
        } else {
            out[j, f_names[[h]]] <- 0
        }
    }
}

但是它只返回 NA。当我输入每个功能名称时它会起作用,如下所示。

for (h in 1:length(f_names)) {
    for (j in 1:nrow(f_freq)) {
        t1 <- filter(df, Feature == "F1")
        if (f_freq$PID[j] %in% t1$PID) {
            f_freq[j, "F1"] <- t1[t1$PID == f_freq$ID[j], "Freq"]
        } else {
            out[j, "F1"] <- 0
        }
    }
}

但我在实际数据中有 35 个特征,所以我想将其自动化。我不确定为什么第一个循环不起作用。如果有人知道如何解决这个问题,请告诉我!!

【问题讨论】:

    标签: r for-loop


    【解决方案1】:

    我们可以在没有任何循环的情况下做到这一点。只需对第一个数据集“df”和“f_freq”中的列子集执行left_join(无需在新数据集中创建“F\d+”列)。使用spread 将“长”重塑为“宽”

    library(tidyverse)
    left_join(df, f_freq[1:2]) %>%             
             spread(Feature, Freq, fill = 0)
    #  PID Level F1 F2 F3
    #1   1   low  0  2  1
    #2   2   mid  3  1  2
    #3   3  high  4  0  3
    

    如果我们只需要 'F' 列的二进制输出,请将 'Freq' 更改为 1 并执行 spread

    left_join(df, f_freq[1:2]) %>%    
         mutate(Freq = 1) %>%
         spread(Feature, Freq, fill = 0)
    

    【讨论】:

    • 这很好用。我不知道填充参数,这就是我使用循环的原因。它对我有很大帮助。谢谢!
    猜你喜欢
    • 2019-07-13
    • 2019-07-28
    • 1970-01-01
    • 2021-12-13
    • 2020-09-01
    • 2019-05-22
    • 2018-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多