首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R中如何将列添加到不等长的数据表中

在R中如何将列添加到不等长的数据表中
EN

Stack Overflow用户
提问于 2022-06-29 15:23:29
回答 2查看 58关注 0票数 0

我有一个data.frame,我想根据另一个列的模式添加一个额外的列,但是数值列表的长度不相等。

代码语言:javascript
复制
class(mylist)
[1] "numeric"

mylist 
 [1]  90 100  97 100  93 100  90 100 100 100 100 100 100 100  96 100 100 100 100 100

这是我的data.frame,我只是展示了其中的一部分

代码语言:javascript
复制
df[16:26,]
# A tibble: 11 × 9
   parent  node branch.length label     isTip      x     y  branch angle
    <int> <int>         <dbl> <chr>     <lgl>  <dbl> <dbl>   <dbl> <dbl>
 1     30    16     0.0000117 sample-59 TRUE  0.0213 15    0.0213  257. 
 2     39    17     0.0000179 sample-62 TRUE  0.0213  4    0.0213   68.6
 3     32    18     0.0000212 sample-63 TRUE  0.0213  3    0.0213   51.4
 4     40    19     0.0000147 sample-68 TRUE  0.0213  5    0.0213   85.7
 5     40    20     0.0000147 sample-69 TRUE  0.0213  6    0.0213  103. 
 6     28    21     0.00630   sample-5  TRUE  0.0213 11    0.0181  189. 
 7     22    22     0         NA        FALSE 0       8.20 0       140. 
 8     22    23     0.0143    NA        FALSE 0.0143 13.9  0.00715 239. 
 9     22    24     0.0129    NA        FALSE 0.0129  2.47 0.00645  42.3
10     24    25     0.000115  NA        FALSE 0.0130  3.94 0.0130   67.5
11     25    26     0.00241   NA        FALSE 0.0154  5.88 0.0142  101.

因此,我希望将mylist添加到数据帧的末尾,但只对那些在isTip列中为FALSE的行添加mylist。

我通常这样做:

过滤器

代码语言:javascript
复制
dfisTip <- filter(df, isTip == FALSE)

将列表添加为列(btp)

代码语言:javascript
复制
dfisTip$btp <- mylist

并加入数据仓库

代码语言:javascript
复制
df <- left_join(df, dfisTip)
Joining, by = c("parent", "node", "branch.length", "label", "isTip", "x", "y", "branch", "angle")



df[16:26, ]
# A tibble: 11 × 10
   parent  node branch.length label     isTip      x     y  branch angle   btp
    <int> <int>         <dbl> <chr>     <lgl>  <dbl> <dbl>   <dbl> <dbl> <dbl>
 1     30    16     0.0000117 sample-59 TRUE  0.0213 15    0.0213  257.     NA
 2     39    17     0.0000179 sample-62 TRUE  0.0213  4    0.0213   68.6    NA
 3     32    18     0.0000212 sample-63 TRUE  0.0213  3    0.0213   51.4    NA
 4     40    19     0.0000147 sample-68 TRUE  0.0213  5    0.0213   85.7    NA
 5     40    20     0.0000147 sample-69 TRUE  0.0213  6    0.0213  103.     NA
 6     28    21     0.00630   sample-5  TRUE  0.0213 11    0.0181  189.     NA
 7     22    22     0         NA        FALSE 0       8.20 0       140.     90
 8     22    23     0.0143    NA        FALSE 0.0143 13.9  0.00715 239.    100
 9     22    24     0.0129    NA        FALSE 0.0129  2.47 0.00645  42.3    97
10     24    25     0.000115  NA        FALSE 0.0130  3.94 0.0130   67.5   100
11     25    26     0.00241   NA        FALSE 0.0154  5.88 0.0142  101.     93

isTip列中所有带TRUE的行在btp列中都有NA,而那些带FALSE的行都有数字!

我只是在想,这是不是其他简单的方法?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-06-29 15:31:27

我们通常用data[rows, columns]索引数据帧。如果要将mylist分配给isTip == FALSE所在的行的"btp"列(我们将以!isTip的形式编写),则可以这样做:

代码语言:javascript
复制
df[!isTip, "btp"] <- mylist

mylist需要正确的长度。

或者,在dplyr中,您可以在不分割数据的情况下这样做(尽管我更喜欢上面的直接赋值)。

代码语言:javascript
复制
df %>%
  left_join(data.frame(isTip = FALSE, btp = mylist), by = "isTip")
票数 3
EN

Stack Overflow用户

发布于 2022-06-29 15:29:18

你说得对--没有必要分割和重新加入数据。下面是虹膜数据集的一个示例:

代码语言:javascript
复制
data("iris")

vector_length_virginica  <- c(1:50)
iris$newcol[iris$Species=="virginica"]  <- vector_length_virginica

现在,新列newcol包含向量(而不是列表) vector_length_virginica的值,其中Species=="viriginica"),而该列中的其余值是NA

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72803991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档