【问题标题】:list - create new column in data.frames with letters assigned to specific numberslist - 在 data.frames 中创建新列,并将字母分配给特定数字
【发布时间】:2016-08-05 23:14:28
【问题描述】:

我有一个包含 10 个数据帧的列表,每个数据帧有 3 列。我需要为每个带有字母的 data.frame 创建一个新列。这些字母必须有条件地分配给特定的 data.frame 列。

这是列表中我的 data.frame 之一:

[[10]]
     x   y   z   
1   24  20  15    
2   25  15  25     
3   25  14  20  

必须从中分配新值的列是z。所以假设 15 = S,25 = A,20 = T。

我的带有新列的 data.frame 应该是:

[[10]]
     x   y   z  new_col
1   24  20  15   S  
2   25  15  25   A  
3   25  14  20   T

更新

我正在尝试使用我的真实数据(遵循@csgillespie 的建议):

lookup <- data.frame(num = c(-5, -1:8, 13:20, 25:32), let = c('P', 'A', 'E', 'AE', 'ASE', 'AS', 'ASW',
                                                                 'ZQ', 'AW', 'AN', 'OQ', 'AA', 'RT', 'SE', 
                                                                 'S', 'QP', 'W', 'NW', 'N', 'C', 'YE', 'PP',
                                                                 'ZQ', 'CS', 'L', 'CW', 'UW', 'CN'))

lst <- lapply(lst, function(i) 
    cbind(i, new_col=lookup[i$x, 2]))

但我收到以下错误,可能是由于查找 data.frame 上的负数:

[.default(xj, i) 中的错误:只有 0 可能与负数混合 下标


第二次更新

谢谢@m-dz!

工作完成:)

【问题讨论】:

    标签: r list dataframe


    【解决方案1】:

    为了可读性,我会选择merge()

    dd <- data.frame(x = 1:3, y = 1:3, z = 3:1)
    dd_list <- list(dd, dd)
    lookup <- data.frame(what = 1:3,
                         new_col = c("Q", "W", "E"))
    lapply(dd_list, function(dd) merge(dd, lookup, by.x = "z", by.y = "what", sort = FALSE))
    

    编辑:忘记了“列表”部分。

    编辑2:刚刚意识到merge() 对列进行重新排序并按by 列对它们进行排序,sort = FALSE 处理后者,但是为了保持列的原始顺序,它们需要重新排序。我会在这里使用data.table 和它的setorder()(或者实际上是它的merge() 实现)或者这里的任何东西:How does one reorder columns in a data frame?

    【讨论】:

      【解决方案2】:

      一个简单的lapplycbind 应该可以工作。

      示例列表

      dd = data.frame(x = 1:3, y = 1:3, z = 1:3)
      l = list(dd, dd)
      look_up = data.frame(value = 1:3, letter = c("A", "B", "Z"))
      

      然后循环遍历l 的每个元素,并使用look_up 作为查找表添加一个新列

      lapply(l,function(i) 
        cbind(i, new_col=look_up[i$z, 2]))
      

      【讨论】:

      • 嗨,谢谢。对于我的真实列表,这些字母不是按字母顺序排列的。有什么方法可以先给每个数字分配一个特定的字母,然后将它们组合成一个新的列?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-31
      • 2023-02-17
      • 1970-01-01
      • 2014-02-04
      • 1970-01-01
      • 2020-06-09
      • 2022-01-18
      相关资源
      最近更新 更多