为什么apply(x,1,paste0(collapse =“”)在正值之间留下空格?

时间:2016-08-02 22:17:05

标签: r dataframe apply

当我在这个示例中跨列应用时,我得到一个空值,用于正值数字,但不是负数值?为什么是这样?不应该paste0删除元素之间的空格?这个问题背后的背景是我正在尝试为googlemaps方向api形成端点。

library(dplyr)
stop_latlon <- data.frame(lat = paste0("via:", rnorm(10)), lon = rnorm(10))

stop_latlon %>% 
  apply(1, function(x) paste0(x, collapse = "%7")) 

编辑:我认为它与在不同数据类型的数据框上运行应用程序有关(lat是一个字符而lon是数字)

2 个答案:

答案 0 :(得分:1)

为什么出现空白区域?

paste0不会添加空格 - 也不会将其删除。您只需在向量上调用paste0即可对此进行测试。

apply在矩阵和数组上运行,而不是数据帧。将数据框传递给apply时,会将其强制转换为矩阵。当然,矩阵的主要内容是所有元素必须是相同的类型。由于字符串或因子通常不能被强制转换为数字,因此您的数字会被强制转换为与第一列匹配的字符串或因子。如果您检查as.matrix.data.frame,则会看到format用于此转化,?format显示默认trim = FALSE,表示

  

trim;如果FALSE,则逻辑,数值和复数值右对齐到公共宽度:如果TRUE,则会抑制对齐的前导空格。

所以你的问题就出现了!

解决方案是什么?

pastepaste0是矢量化的,因此没有理由一次apply一行。您可以直接将列粘贴在一起:

with(stop_latlon, paste0(lat, "%7", lon))

在更复杂的情况下,apply确实是必要的,解决方案是处理您自己的矩阵转换,而不是依靠apply来执行默认设置。如果在将数据传递给apply之前将所有列字符串设置为 { type: "postback", title: "View Details", payload: "details:12345" } ,(或者如果使用字符矩阵而不是数据帧),则转换将是直接的(或不必要的)。

答案 1 :(得分:-1)

由于您已经在使用dplyr,因此使用dplyr解决方案

stop_latlon %>% rowwise() %>% 
  summarise(latlon = paste0(lat, "%7", lon))

# A tibble: 10 x 1
                                       latlon
                                        <chr>
1     via:1.222988975822%7-0.0916195541513781
2     via:0.159343465931011%72.13195314768885
3    via:-1.20468509249113%70.207717129395512
4  via:-0.134019685121819%7-0.912028913867691
5    via:-0.279895116522155%71.93812564387851
6     via:1.34379237820276%70.500525410068601
7   via:0.808272181619927%7-0.942578996972991
8    via:-1.17359899808855%70.126116638988962
9      via:1.1859602145711%7-1.00865269561505
10    via:1.77635906904826%70.685722866041471

默认情况下,使用tibble代替data.frame不会将您的矢量转换为系数,我认为在此实例中是理想的。

此外,关于paste0的问题,它不会删除单词之间的空格,它只是在连接时不添加它们。 stringr包中的str_trim将为您修剪空白。

stop_latlon <- data.frame(lat = paste0("via:", rnorm(10)),
                          lon = rnorm(10), stringsAsFactors = FALSE)


library(stringr)
stop_latlon %>% 
  apply(1, function(x) paste0(str_trim(x), collapse = "%7")) 

也会提供所需的结果。