【问题标题】:Combine five columns of a dataframe to two new lists [duplicate]将数据框的五列合并到两个新列表中[重复]
【发布时间】:2018-05-09 18:11:50
【问题描述】:

我有一个data.frame NOAA_OLR_TEST:

NOAA_OLR_TEST <- structure(list(DATE_START = structure(c(1170720000, 1170806400,
1170892800, 1170979200, 1171065600, 1171152000, 1171238400, 1171324800,
1171411200, 1171497600), class = c("POSIXct", "POSIXt")), 
DATE_END = structure(c(1171065600,1171152000, 1171238400, 1171324800, 
1171411200, 1171497600, 1171584000,1171670400, 1171756800, 1171843200), 
class = c("POSIXct", "POSIXt")), LONGITUDE = c(-89.5, -89.5, -89.5, -89.5, 
-89.5, -88.5, -88.5,-88.5, -88.5, -88.5), LATITUDE = c(-179.5, -179.5, -179.5, 
-179.5,-179.5, -179.5, -179.5, -179.5, -179.5, -179.5), OLR_DATA_1 = c(150,146, 
146, 142, NA, 150, 158, 155, 143, 142), OLR_DATA_2 = c(146,146, 142, 141, 150, 
NA, 155, 143, 142, 138), OLR_DATA_3 = c(146,NA, 141, 150, 158, 155, 143, 142, 
138, 135), OLR_DATA_4 = c(142,141, 150, 158, 155, 143, 142, 138, 135, NA), 
OLR_DATA_5 = c(141,150, NA, 155, 143, 142, 138, 135, 140, 139)), 
.Names = c("DATE_START","DATE_END", "LONGITUDE", "LATITUDE", "OLR_DATA_1", 
"OLR_DATA_2","OLR_DATA_3", "OLR_DATA_4", "OLR_DATA_5"), row.names = c(NA,10L), 
class = "data.frame") 

这是我的数据:

head(NOAA_OLR_TEST)

 DATE_START   DATE_END LONGITUDE LATITUDE OLR_DATA_1 OLR_DATA_2 OLR_DATA_3 OLR_DATA_4 OLR_DATA_5
1 2007-02-06 2007-02-10     -89.5   -179.5        150        146        146        142        141
2 2007-02-07 2007-02-11     -89.5   -179.5        146        146         NA        141        150
3 2007-02-08 2007-02-12     -89.5   -179.5        146        142        141        150         NA
4 2007-02-09 2007-02-13     -89.5   -179.5        142        141        150        158        155
5 2007-02-10 2007-02-14     -89.5   -179.5         NA        150        158        155        143
6 2007-02-11 2007-02-15     -88.5   -179.5        150         NA        155        143        142

我的期望是将数据帧NOAA_OLR_TEST[5:9] 的第 5 列到第 9 列转换为两个名为 data_list_1data_list_2 的列表:

 DATE_START   DATE_END LONGITUDE LATITUDE        DATA_LIST_1     DATA_LIST_2  
1 2007-02-06 2007-02-10     -89.5   -179.5        (150 ,146)      (146,142,141)
2 2007-02-07 2007-02-11     -89.5   -179.5        (146 ,146)      ( NA,141,150)
3 2007-02-08 2007-02-12     -89.5   -179.5        (146 ,142)      (141,150, NA)
4 2007-02-09 2007-02-13     -89.5   -179.5        (142 ,141)      (150,158,155)
5 2007-02-10 2007-02-14     -89.5   -179.5        ( NA ,150)      (158,155,143)
6 2007-02-11 2007-02-15     -88.5   -179.5        (150 , NA)      (155,143,142)

我用的是mapply,Map,cbind,都有一些错误。

【问题讨论】:

  • 这个问题与you asked before 的问题有何显着不同?您已经收到了很多对前一个问题的答案,但实际上您似乎没有考虑过这些答案。如果您只是继续重新发布相同/相似的问题而忽略其他人给您的回复,那么您在这里不会很受欢迎。
  • 感谢 cmets,但它是一个不同的列表,它有 2 个列表,每个列表都有不同的列数
  • 完全不同。在回答您之前的问题时向您介绍的完全相同的概念和解决方案也适用于此。

标签: r list dataframe data.table


【解决方案1】:

编辑如果您希望数据表现为列表,您将无法在表格中将其视为逗号分隔的字符串。但是,数据仍将作为普通列表提供。

library(data.table)
setDT(NOAA_OLR_TEST)
NOAA_OLR_TEST[, DATA_LIST_1 := lapply(transpose(.SD), as.list), 
              .SDcols = c("OLR_DATA_1","OLR_DATA_2")]
NOAA_OLR_TEST[, DATA_LIST_2 := lapply(transpose(.SD), as.list), 
              .SDcols = c("OLR_DATA_3","OLR_DATA_4","OLR_DATA_5")]
NOAA_OLR_TEST[,(5:9):= NULL]
             DATE_START            DATE_END LONGITUDE LATITUDE DATA_LIST_1 DATA_LIST_2
 1: 2007-02-05 19:00:00 2007-02-09 19:00:00     -89.5   -179.5      <list>      <list>
 2: 2007-02-06 19:00:00 2007-02-10 19:00:00     -89.5   -179.5      <list>      <list>
 3: 2007-02-07 19:00:00 2007-02-11 19:00:00     -89.5   -179.5      <list>      <list>
 4: 2007-02-08 19:00:00 2007-02-12 19:00:00     -89.5   -179.5      <list>      <list>
 5: 2007-02-09 19:00:00 2007-02-13 19:00:00     -89.5   -179.5      <list>      <list>
 6: 2007-02-10 19:00:00 2007-02-14 19:00:00     -88.5   -179.5      <list>      <list>
 7: 2007-02-11 19:00:00 2007-02-15 19:00:00     -88.5   -179.5      <list>      <list>
 8: 2007-02-12 19:00:00 2007-02-16 19:00:00     -88.5   -179.5      <list>      <list>
 9: 2007-02-13 19:00:00 2007-02-17 19:00:00     -88.5   -179.5      <list>      <list>
10: 2007-02-14 19:00:00 2007-02-18 19:00:00     -88.5   -179.5      <list>      <list>

显示列表确实是数字:

first_row <- NOAA_OLR_TEST[DATE_START==as.POSIXct("2007-02-05 19:00:00")]
str(first_row$DATA_LIST_1[[1]])
List of 2
 $ OLR_DATA_1: num 150
 $ OLR_DATA_2: num 146

【讨论】:

  • class(NOAA_OLR_TEST$DATA_LIST_1) 是[1]个“字符”,可以是数字
  • 我编辑了我的答案。
【解决方案2】:

这是我的mutate(pmap()) 方法:

# "name =" isn't necessary.
d1 <- NOAA_OLR_TEST %>% 
  # as.tibble() %>% 
  mutate(data_list_1 = pmap(., ~ c(OLR_DATA_1 = ..5, OLR_DATA_2 = ..6)), 
         data_list_2 = pmap(., ~ c(OLR_DATA_3 = ..7, OLR_DATA_4 = ..8, OLR_DATA_5 = ..9))) %>% 
  select(-(5:9))

d2 <- NOAA_OLR_TEST %>% 
  # as.tibble() %>% 
  mutate(data_list_1 = pmap(., ~ list(OLR_DATA_1 = ..5, OLR_DATA_2 = ..6)), 
         data_list_2 = pmap(., ~ list(OLR_DATA_3 = ..7, OLR_DATA_4 = ..8, OLR_DATA_5 = ..9))) %>% 
  select(-(5:9))

d1
d1 %>% as.tibble()
d2 %>% as.tibble()

【讨论】:

    【解决方案3】:

    您可以使用apply,如下所示:

    NOAA_OLR_TEST_2 <- NOAA_OLR_TEST[, 1:4]
    NOAA_OLR_TEST_2$list1 <- apply(NOAA_OLR_TEST[, 5:6], 1, list)
    NOAA_OLR_TEST_2$list2 <- apply(NOAA_OLR_TEST[, 7:9], 1, list)
    NOAA_OLR_TEST_2
    

    结果:

    > NOAA_OLR_TEST_2
                DATE_START            DATE_END LONGITUDE LATITUDE    list1         list2
    1  2007-02-06 01:00:00 2007-02-10 01:00:00     -89.5   -179.5 150, 146 146, 142, 141
    2  2007-02-07 01:00:00 2007-02-11 01:00:00     -89.5   -179.5 146, 146  NA, 141, 150
    3  2007-02-08 01:00:00 2007-02-12 01:00:00     -89.5   -179.5 146, 142  141, 150, NA
    4  2007-02-09 01:00:00 2007-02-13 01:00:00     -89.5   -179.5 142, 141 150, 158, 155
    5  2007-02-10 01:00:00 2007-02-14 01:00:00     -89.5   -179.5  NA, 150 158, 155, 143
    6  2007-02-11 01:00:00 2007-02-15 01:00:00     -88.5   -179.5  150, NA 155, 143, 142
    7  2007-02-12 01:00:00 2007-02-16 01:00:00     -88.5   -179.5 158, 155 143, 142, 138
    8  2007-02-13 01:00:00 2007-02-17 01:00:00     -88.5   -179.5 155, 143 142, 138, 135
    9  2007-02-14 01:00:00 2007-02-18 01:00:00     -88.5   -179.5 143, 142 138, 135, 140
    10 2007-02-15 01:00:00 2007-02-19 01:00:00     -88.5   -179.5 142, 138  135, NA, 139
    

    如果要排除NA-values,可以修改代码为:

    NOAA_OLR_TEST_2 <- NOAA_OLR_TEST[, 1:4]
    NOAA_OLR_TEST_2$list1 <- apply(NOAA_OLR_TEST[, 5:6], 1, function(x) list(na.omit(x)))
    NOAA_OLR_TEST_2$list2 <- apply(NOAA_OLR_TEST[, 7:9], 1, function(x) list(na.omit(x)))
    

    【讨论】:

    • 谢谢,这种情况下如何去掉NA,我用lapply(list, function(x) x[!is.na(x)]),但是id不起作用
    • @Pan 你可以使用na.omit,看我更新的答案。
    • 谢谢,如何删除 NOAA_OLR_TEST_2$list2 。使用 NOAA_OLR_TEST_2$list2
    • @Pan 是的,但使用大写字母:NOAA_OLR_TEST_2$list2 &lt;- NULL
    • 当我使用 tsclust (NOAA_OLR_TEST_2$list2,...) 函数时,它有错误: FUN(X[[i]], ...) 中的错误:系列必须是数字跨度>
    猜你喜欢
    • 1970-01-01
    • 2022-01-14
    • 2015-04-18
    • 1970-01-01
    • 2018-09-04
    • 2011-11-18
    • 2017-08-02
    • 1970-01-01
    • 2019-09-19
    相关资源
    最近更新 更多