当我在这个示例中跨列应用时,我得到一个空值,用于正值数字,但不是负数值?为什么是这样?不应该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是数字)
答案 0 :(得分:1)
paste0
不会添加空格 - 也不会将其删除。您只需在向量上调用paste0
即可对此进行测试。
apply
在矩阵和数组上运行,而不是数据帧。将数据框传递给apply
时,会将其强制转换为矩阵。当然,矩阵的主要内容是所有元素必须是相同的类型。由于字符串或因子通常不能被强制转换为数字,因此您的数字会被强制转换为与第一列匹配的字符串或因子。如果您检查as.matrix.data.frame
,则会看到format
用于此转化,?format
显示默认trim = FALSE
,表示
trim
;如果FALSE
,则逻辑,数值和复数值右对齐到公共宽度:如果TRUE
,则会抑制对齐的前导空格。
所以你的问题就出现了!
paste
和paste0
是矢量化的,因此没有理由一次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"))
也会提供所需的结果。