我想创建按所有唯一站点对我的数据框进行排序,并在另一列中列出所有值(不对这些值执行任何功能)。每个站点的值将具有不同的长度。我想保持数值为数字,以便以后可以进行一些数据操作(例如箱形图)。
我可以使用tidyverse并创建一串不均匀的字符。
样本数据
a<-data.frame(c(41.14542,41.14542,41.14542,41.14542,41.14542),
c(-74.1129,-74.1129,-74.1129,-74.1129,-74.1129), c(89,36,20,26,35))
colnames(a)<-c("LAT","LONG","value")
b<-data.frame(c(43.00309,43.00309,43.00309),
c(-75.02384,-75.02384,-75.02384), c(1,17,20))
colnames(b)<-c("LAT","LONG","value")
c<-data.frame(c(43.17203,43.17203), c(-77.52824,-77.52824), c(2,2))
colnames(c)<-c("LAT","LONG","value")
samp_data<-rbind(a,b,c)
我尝试过的代码
library(tidyverse)
samp<-samp_data %>% group_by(LAT, LONG) %>% mutate(value_string = paste(value, collapse = ",")) %>% select(LAT, LONG, value_string) %>% unique()
这给了我这个结果:
LAT LONG value_string
<dbl> <dbl> <chr>
1 41.1 -74.1 89,36,20,26,35
2 43.0 -75.0 1,17,20
3 43.2 -77.5 2,2
*我不知道为什么要四舍五入我的LAT / LONG值。
我需要第三列是数字,而不是字符串。所以类似的事情会起作用(注意value_string的类):
LAT LONG value_string
<dbl> <dbl> <dbl>
1 41.1 -74.1 89,36,20,26,35
2 43.0 -75.0 1,17,20
3 43.2 -77.5 2,2
我研究了汇总(似乎需要应用一些功能),玩列表(每个站点的长度不均匀的问题),但无法使其正常工作。
此外,我也不想汇总,即网站(43.17203,-77.52824)需要出现两次,而不是被视为一行。因此,这并不理想:
LAT LONG value_string
<dbl> <dbl> <chr>
1 41.1 -74.1 89,36,20,26,35
2 43.0 -75.0 1,17,20
3 43.2 -77.5 2
(第3行只有一个值,而不是两个值)。
提前谢谢!
答案 0 :(得分:3)
一种选择是for z in regress:
for t in control:
y,x=dmatrices('a~{}+{}'.format(z,t), data=df)
print('a~{}+{}'.format(z,t))
print(y,x)
a~b+e
[[1.]
[2.]
[3.]
[4.]] [[1. 5. 8.]
[1. 6. 4.]
[1. 7. 5.]
[1. 8. 3.]]
a~c+e
[[1.]
[2.]
[3.]
[4.]] [[1. 8. 8.]
[1. 4. 4.]
[1. 5. 5.]
[1. 3. 3.]]
a~d+e
[[1.]
[2.]
[3.]
[4.]] [[ 1. 1. 8.]
[ 1. 3. 4.]
[ 1. 55. 5.]
[ 1. 3. 3.]]
保留这些值以使其保持数字状态
nest
这将具有library(dplyr)
temp <- samp_data %>%
group_by(LAT, LONG) %>%
tidyr::nest(value)
temp
# LAT LONG data
# <dbl> <dbl> <list>
#1 41.1 -74.1 <tibble [5 × 1]>
#2 43.0 -75.0 <tibble [3 × 1]>
#3 43.2 -77.5 <tibble [2 × 1]>
列作为列表值,并且每个列都有一个名为data
的数字列。
value
答案 1 :(得分:1)
我们可以使用list
将'值'放入summarise
library(dplyr)
out <- samp_data %>%
group_by(LAT, LONG) %>%
summarise(value = list(unique(value)))
out
# A tibble: 3 x 3
# Groups: LAT [3]
# LAT LONG value
# <dbl> <dbl> <list>
#1 41.1 -74.1 <dbl [5]> #note the different length of the list column
#2 43.0 -75.0 <dbl [3]>
#3 43.2 -77.5 <dbl [1]>
我们可以用
out %>%
unnest %>%
boxplot(value ~ LAT, data = ., main = "residuals by covariate",
xlab = "LAT", ylab = "value")
-情节
答案 2 :(得分:0)
在unique()
之后立即使用group_by()
怎么样?
samp_data_unique = samp_data %>%
group_by(LAT, LONG) %>%
unique()
这对我有用。输出看起来像这样。
> samp_data_unique
# A tibble: 9 x 3
# Groups: LAT, LONG [3]
LAT LONG value
<dbl> <dbl> <dbl>
1 41.1 -74.1 89
2 41.1 -74.1 36
3 41.1 -74.1 20
4 41.1 -74.1 26
5 41.1 -74.1 35
6 43.0 -75.0 1
7 43.0 -75.0 17
8 43.0 -75.0 20
9 43.2 -77.5 2
希望您对此有帮助。