【问题标题】:Add a column to a dataframe, skip pasting in rows with -向数据框添加一列,跳过粘贴 -
【发布时间】:2019-06-11 18:50:48
【问题描述】:

我在合并时遇到问题。

我有 2 个数据框。

数据框 1:

structure(list(row = c(1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 
2, 3), col = c(1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5), 
    ltr = c("-", ".", ".", ".", ".", "Q", ".", "A", "R", "-", 
    ".", ".", ".", "T", ".")), row.names = c(NA, 15L), class = "data.frame")

数据框2:

structure(list(freq = c("0.76423", "0.76423", "0.03546", "0.43677", 
"0.76972", "0.45678", "0.23145", "0.56835", "0.23145")), row.names = c(NA, 
-9L), class = "data.frame")

我想将 freq 列从 dataframe2 复制到 dataframe1。 我想避免粘贴几行

如果 dataframe1 有 ltr = "-"(跳过该行和具有相同 col 值的后续行)

row col ltr freq
1    1   -   skip
2    1   .   skip
3    1   .   skip
1    2   .   0.76423

我尝试了循环,但没有成功。 结果应该是这样的

structure(list(row = c(1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 
2, 3), col = c(1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5), 
    ltr = c("-", ".", ".", ".", ".", "Q", ".", "A", "R", "-", 
    ".", ".", ".", "T", "."), freq = c("NA", "NA", "NA", "0.76423", 
    "0.76423", "0.03546", "0.43677", "0.76972", "0.45678", "NA", 
    "NA", "NA", "0.23145", "0.56835", "0.23145")), row.names = c(NA, 
15L), class = "data.frame")

谢谢!

【问题讨论】:

    标签: r


    【解决方案1】:

    一个选项是按“col”分组,通过检查“ltr”列中是否存在any“-”和第二个数据集中带有“freq”的replace TRUE 元素来创建一个逻辑列('df2')

    library(dplyr)
    df1 %>% 
       group_by(col) %>% 
       mutate(freq = if(any(ltr == "-")) NA else TRUE) %>% 
       ungroup %>% 
       mutate(freq = replace(freq, which(freq), df2$freq))
    # A tibble: 15 x 4
    #     row   col ltr   freq   
    #   <dbl> <dbl> <chr> <chr>  
    # 1     1     1 -     <NA>   
    # 2     2     1 .     <NA>   
    # 3     3     1 .     <NA>   
    # 4     1     2 .     0.76423
    # 5     2     2 .     0.76423
    # 6     3     2 Q     0.03546
    # 7     1     3 .     0.43677
    # 8     2     3 A     0.76972
    # 9     3     3 R     0.45678
    #10     1     4 -     <NA>   
    #11     2     4 .     <NA>   
    #12     3     4 .     <NA>   
    #13     1     5 .     0.23145
    #14     2     5 T     0.56835
    #15     3     5 .     0.23145
    

    或者用data.table,将'data.frame'转换为'data.table'(setDT(df1)),按'col'分组,根据逻辑表达式找到行索引(.I),指定i 中的索引,并分配 (:=) 'df2' 中的 'freq' 值以在 'df1' 中创建 'freq' 列。默认情况下,i中没有的位置会被NA补上

    library(data.table)
    i1 <- setDT(df1)[, .I[all(ltr != "-")], col]$V1
    df1[i1, freq := df2$freq]
    df1
    #    row col ltr    freq
    # 1:   1   1   -    <NA>
    # 2:   2   1   .    <NA>
    # 3:   3   1   .    <NA>
    # 4:   1   2   . 0.76423
    # 5:   2   2   . 0.76423
    # 6:   3   2   Q 0.03546
    # 7:   1   3   . 0.43677
    # 8:   2   3   A 0.76972
    # 9:   3   3   R 0.45678
    #10:   1   4   -    <NA>
    #11:   2   4   .    <NA>
    #12:   3   4   .    <NA>
    #13:   1   5   . 0.23145
    #14:   2   5   T 0.56835
    #15:   3   5   . 0.23145
    

    【讨论】:

    • 谢谢@Akrun!它与此测试数据完美配合。但是当我尝试在原始数据上使用它时,它会出错。 x[list]
    • @user11352627 如果匹配索引的元素数量与第二个数据不同,这是可能的。您可能需要对此进行更正。这里,假设第二个数据集的数据点数与第一个数据中的行子集完全相同
    • 非常感谢@akrun!我会检查的。
    • @user11352627 第二个数据的一个问题是除了值之外没有任何信息。因此,可能很难从 df2 中精确定位
    • 你好@akrun,它成功了。我只需要更改列名。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-18
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多