我有一个data.frame,我想根据另一个列的模式添加一个额外的列,但是数值列表的长度不相等。
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,我只是展示了其中的一部分
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。
我通常这样做:
过滤器
dfisTip <- filter(df, isTip == FALSE)将列表添加为列(btp)
dfisTip$btp <- mylist并加入数据仓库
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. 93isTip列中所有带TRUE的行在btp列中都有NA,而那些带FALSE的行都有数字!
我只是在想,这是不是其他简单的方法?
谢谢!
发布于 2022-06-29 15:31:27
我们通常用data[rows, columns]索引数据帧。如果要将mylist分配给isTip == FALSE所在的行的"btp"列(我们将以!isTip的形式编写),则可以这样做:
df[!isTip, "btp"] <- mylistmylist需要正确的长度。
或者,在dplyr中,您可以在不分割数据的情况下这样做(尽管我更喜欢上面的直接赋值)。
df %>%
left_join(data.frame(isTip = FALSE, btp = mylist), by = "isTip")发布于 2022-06-29 15:29:18
你说得对--没有必要分割和重新加入数据。下面是虹膜数据集的一个示例:
data("iris")
vector_length_virginica <- c(1:50)
iris$newcol[iris$Species=="virginica"] <- vector_length_virginica现在,新列newcol包含向量(而不是列表) vector_length_virginica的值,其中Species=="viriginica"),而该列中的其余值是NA。
https://stackoverflow.com/questions/72803991
复制相似问题