将列表中每个数据框的前4行细分

时间:2020-06-04 19:05:49

标签: r list dataframe subset cbind

我有两个要合并的数据帧列表,但是它们具有不同的行数,因此我想获取列表中每个数据帧的前四行,以便能够合并它们。

我尝试了几件事,但希望不高,因此不胜感激。

这是我想要的例子:

hitID    Data    Time                   hitID     Data      Time
1        A        2                     1         A         2
2        B        3                     2         B         3
3        C        4                     3         C         4
4        D        5

谢谢您的帮助,这是我的数据,每个列表看起来都像这样: enter image description here enter image description here 如您所见,有些数据框只有4行。我的目的是使数据组合在一起,这样我就可以得到驾驶员一个人名的数据,然后在同一行上得到熨斗中相同人名的数据。这意味着我最终得到的数据帧列表与上面的类似,但是可以从中选择重要数据的列增加了一倍。我不介意这是否意味着失去第5行。

3 个答案:

答案 0 :(得分:1)

您可以使用Reducemerge应用于列表中的子集数据帧。

Reduce(function(...) merge(..., all=TRUE), lapply(l, function(x) x[1:4, ]))
#    X1 X2 X3
# 1   1  1  1
# 2   1  1  1
# 3   1  1  1
# 4   1  1  1
# 5   2  2  2
# 6   2  2  2
# 7   2  2  2
# 8   2  2  2
# 9   3  3  3
# 10  3  3  3
# 11  3  3  3
# 12  3  3  3

数据:

dat1 <- data.frame(matrix(1, 6, 3))
dat2 <- data.frame(matrix(2, 4, 3))
dat3 <- data.frame(matrix(3, 5, 3))

l <- list(dat1, dat2, dat3)

答案 1 :(得分:1)

我们可以使用Map遍历两个list,在head s中获取每个数据集的list的前4行,然后执行{ {1}}

merge

如果只有一个Map(function(dat1, dat2) merge(head(dat1, 4), head(dat2, 4), by = c('hitID')), lst1, lst2) ,那么使用list的方法就是

tidyverse

答案 2 :(得分:0)

我无法看到您的数据,因为打印质量不好,所以我正在创建一些数据,您告诉它是否有帮助:

library(dplyr)

# Creating data
Ages = data.frame(names = c("John",
                            "Claire",
                            "Steve",
                            "Pete"),
                  Age = c(31, 25, 17, 42))

Jobs = data.frame(names = c("Harry",
                            "Thomas",
                            "Steve",
                            "Pete",
                            "John",
                            "Claire"),
                  job = c("Economist",
                          "Lawyer",
                          "Driver",
                          "Salesman",
                          "Banking",
                          "Physician"))

# Resulting data frame
Ages
#>    names Age
#> 1   John  31
#> 2 Claire  25
#> 3  Steve  17
#> 4   Pete  42
Jobs
#>    names       job
#> 1  Harry Economist
#> 2 Thomas    Lawyer
#> 3  Steve    Driver
#> 4   Pete  Salesman
#> 5   John   Banking
#> 6 Claire Physician

# Merge only lines that are present in both data frames
data = Ages %>% inner_join(Jobs, by = c("names" = "names"))

data
#>    names Age       job
#> 1   John  31   Banking
#> 2 Claire  25 Physician
#> 3  Steve  17    Driver
#> 4   Pete  42  Salesman

# Keep all lines in Job data frame and merge ones found in Ages data frame
data = Ages %>% right_join(Jobs, by = c("names" = "names"))

data
#>    names Age       job
#> 1   John  31   Banking
#> 2 Claire  25 Physician
#> 3  Steve  17    Driver
#> 4   Pete  42  Salesman
#> 5  Harry  NA Economist
#> 6 Thomas  NA    Lawyer

reprex package(v0.3.0)于2020-06-04创建