【问题标题】:Joining data from two vector members of a list连接来自列表的两个向量成员的数据
【发布时间】:2020-10-04 17:25:24
【问题描述】:

我有这些作业说明。

在每一行打印每个名称,后跟“|”,然后是年龄。 创建一个成员是两个向量的列表。第一个向量包含名字。 列表成员应该有名字 - “名字”和“年龄”。按以下格式输出此列表。

如果我没记错的话,设置需要三件事。包含两个向量的列表。

first_names <- c("Jim", "Frank", "Sally")
ages <- c("25", "34", "42")
list_data <- list(first_names, ages)

# Desired Output
Jim   | 25
Frank | 34
Sally | 42

我可以仅使用两个向量来完成此操作,但当它们包含在列表中时则不行。我是否正确理解说明?

我的版本只有两个向量有效。

first_names <- c("Jim", "Frank", "Sally")
ages <- c("25", "34", "42")

if (length(first_names) == length(ages)) {
  for (i in 1:length(first_names)) {
    print(paste(first_names[i],ages[i],sep = " | "))
  } 
} else {
  print("Error")
}

但是带有列表的版本是我需要帮助的地方。

first_names <- c("Jim", "Frank", "Sally")
ages <- c("25", "34", "42")
list_data <- list(first_names, ages) # list

if (length(list_data[1]) == length(list_data[2])) {
  for (i in 1:length(list_data[1])) {
    print(paste(list_data[1][i],list_data[2][i],sep = " | "))
  } 
} else {
  print("Error")
}

【问题讨论】:

    标签: r


    【解决方案1】:

    paste 是矢量化的,您不需要在此处循环 for

    cat(paste(first_names, ages, sep = " | ", collapse = '\n'))
    
    #Jim | 25
    #Frank | 34
    #Sally | 42
    

    如果您想在某些报告中使用这些表格,可以使用kable 或类似软件包提供更好的方法。


    如果我们想使用list_data,我们可以这样做:

    cat(paste(list_data[[1]], list_data[[2]], sep = " | ", collapse = '\n'))
    

    【讨论】:

    • 谢谢。但按照说明,我必须创建两个向量的列表。在我的问题中,我有list_data &lt;- list(first_names, ages)
    • 感谢@Ronak 的更新。这就是我正在寻找的,因为它只是打印出来而没有矢量符号等。而且它也是初学者级别,在教授其他更高级的功能之前先学习 cat/paste。
    【解决方案2】:
    library( data.table )
    lapply( data.table::transpose(list_data), paste0, collapse = "|" )
    
    
    [[1]]
    [1] "Jim|25"
    
    [[2]]
    [1] "Frank|34"
    
    [[3]]
    [1] "Sally|42"
    

    【讨论】:

    • 谢谢温佩尔。我们还没有进入data.table。我将记录如何在您的答案中使用转置。您是否可以添加另一个不使用 data.table 的版本?更适合初学者的版本。
    • data.table 实际上对初学者很友好......但你必须把头绕在它的 filosofy 周围......然后你可以看到矩阵;-)
    • 是的,它适合初学者。我喜欢它。但是,我们还没有使用它。这可以通过其他方式完成吗?
    • Ronak 的答案正是我的导师想要的。无论如何,我赞成你的回答,因为这是一个很好的解决方案,我将来肯定会使用。再次感谢。
    【解决方案3】:

    您可以将mapplypaste 一起使用。

    mapply(paste, list_data[1], list_data[2], sep = " | ")
    #     [,1]        
    #[1,] "Jim | 25"  
    #[2,] "Frank | 34"
    #[3,] "Sally | 42"
    

    或者没有使用writeLines的行和列:

    writeLines(mapply(paste, list_data[1], list_data[2], sep = " | "))
    #writeLines(paste(list_data[[1]], list_data[[2]], sep = " | ")) #Alternative
    #Jim | 25
    #Frank | 34
    #Sally | 42
    

    或者使用[[而不是[调整您的代码:

    if (length(list_data[1]) == length(list_data[2])) {
      for (i in 1:length(list_data[[1]])) {
        writeLines(paste(list_data[[1]][i],list_data[[2]][i],sep = " | "))
      } 
    } else {
      print("Error")
    }
    #Jim | 25
    #Frank | 34
    #Sally | 42
    

    或使用sprintf 重现所需的输出:

    writeLines(sprintf(paste0("%-", max(nchar(list_data[[1]])), "s", " | %s"),
     list_data[[1]], list_data[[2]]))
    Jim   | 25
    Frank | 34
    Sally | 42
    

    【讨论】:

    • 感谢 GKi。这些效果很好,我会将它们粘贴到我的笔记本中。它们输出相当多的矢量符号等,而上面的 Ronak 解决方案只输出数据。这正是我的导师正在寻找的。我当然会赞成你的回答。
    • 如果您不想要行号和列号,请另外使用 writeLines,如更新中所示。
    • 哇,太酷了。我以前从未见过。我将来会使用它。如果我现在将 writeLines 与 mapply 一起使用,我的老师就会知道这不是我写的,哈哈,非常感谢。
    • 你也可以使用writeLines(paste(list_data[[1]], list_data[[2]], sep = " | "))
    • 谢谢。在一个 Stack 问题中获得这么多信息真是太好了。
    【解决方案4】:

    嗯,你可以在 R 中使用内置函数 pastepaste0。 没有其他要求

    paste0(first_names,"|",ages)
    

    上面的代码会打印出你想要的结果。

    要将其存储在列表中,您可以使用

    as.list(paste0(first_names,"|",ages))
    

    【讨论】:

    • 谢谢。但按照说明,我必须创建两个向量的列表。在我的问题中,我有list_data &lt;- list(first_names, ages)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-05
    • 1970-01-01
    相关资源
    最近更新 更多