特定物种的温度范围通常分布在平均15º左右。我正在尝试根据温度创建该物种比例的数据框,其中所有温度(0º-30º)的范围都大于物种的范围。
但是,当我尝试通过将物种的分布数据与所有温度的数据帧合并来尝试用0来缓冲物种分布的末端以获得完整的0-30°范围时,merge
函数似乎跳过将一个数据集与另一个数据集组合在一起时的一些值:
df <- as.data.frame(rnorm(100, mean=15, sd=2))
# Change column name
colnames(df) <- "x"
# Calculate density
d <- density(df$x,na.rm=T)
# Check it (looks like a normalish distribution)
plot(d)
# As points
plot(d$x, d$y)
# Convert those points to a dataframe
d1 <- cbind(as.data.frame(d$x), as.data.frame(d$y))
colnames(d1) <- c("x", "y")
# Round x to 0.1
d1$x <- (round(d1$x,1))
# Aggregate by x, calling the new columns temperature and proportion
d2 <- aggregate(list(proportion=d1$y), by=list(temperature=d1$x), FUN="mean")
# Round proportion to 0.001
d2$proportion <- round(d2$proportion, 3)
# Create a vector of temperatures from 0-30 in increments of 0.1
alltemps <- as.data.frame(seq(0,30, by=0.1))
# Change the column heading
colnames(alltemps) <- "temperature"
# Merge the two datasets by temperature
d3 <- merge(alltemps, d2, all.x=T)
从这里开始,我会将所有NAs转换为0.但正如您所看到的,合并会从d2中跳过一些值,并在应该有d2值的NAs中放置。
从温度= 7.2开始,d2对于每个0.1º温度增量具有相应的比例:
> d2
temperature proportion
1 7.2 0.000
2 7.3 0.000
3 7.4 0.000
4 7.5 0.000
5 7.6 0.000
6 7.7 0.001
7 7.8 0.001
8 7.9 0.001
9 8.0 0.001
10 8.1 0.002
11 8.2 0.002
12 8.3 0.003
13 8.4 0.003
14 8.5 0.004
15 8.6 0.005
16 8.7 0.006
17 8.8 0.008
18 8.9 0.009
19 9.0 0.010
20 9.1 0.011
21 9.2 0.013
22 9.3 0.014
...
140 21.1 0.004
141 21.2 0.003
142 21.3 0.003
143 21.4 0.002
144 21.5 0.002
145 21.6 0.001
146 21.7 0.001
147 21.8 0.001
148 21.9 0.000
149 22.0 0.000
150 22.1 0.000
151 22.2 0.000
152 22.3 0.000
153 22.4 0.000
alltemps从0.0º到30.0º的增量为0.1º:
> alltemps
temperature
1 0.0
2 0.1
3 0.2
4 0.3
5 0.4
6 0.5
7 0.6
8 0.7
9 0.8
10 0.9
11 1.0
...
69 6.8
70 6.9
71 7.0
72 7.1
73 7.2
74 7.3
75 7.4
76 7.5
...
221 22.0
222 22.1
223 22.2
224 22.3
225 22.4
226 22.5
227 22.6
228 22.7
229 22.8
...
296 29.5
297 29.6
298 29.7
299 29.8
300 29.9
301 30.0
但是当你将它们组合起来时,'merge'会跳过应该从d2添加的一些值(例如7.3,7.6,7.8等):
> d3
temperature proportion
1 0.0 NA
2 0.1 NA
3 0.2 NA
4 0.3 NA
5 0.4 NA
6 0.5 NA
7 0.6 NA
8 0.7 NA
9 0.8 NA
10 0.9 NA
11 1.0 NA
...
71 7.0 NA
72 7.1 NA
73 7.2 0.000
74 7.3 NA
75 7.4 0.000
76 7.5 0.000
77 7.6 NA
78 7.7 0.001
79 7.8 NA
80 7.9 0.001
81 8.0 0.001
82 8.1 0.002
...
151 15.0 0.186
152 15.1 NA
153 15.2 NA
154 15.3 0.183
155 15.4 0.181
156 15.5 0.178
157 15.6 NA
158 15.7 NA
159 15.8 0.168
160 15.9 0.164
161 16.0 0.159
162 16.1 0.154
163 16.2 0.149
164 16.3 0.144
165 16.4 NA
166 16.5 0.132
...
这里发生了什么?这是因为d1是从核密度估计而不是实数生成的吗?
答案 0 :(得分:1)
这使得alltemps
和d2
之间的匹配率提高了大约70个先前跳过的观察值。现在,temperature
中alltemps
中的d2
值仍然存在d2
,但这可以解决它在df <- as.data.frame(rnorm(100, mean=15, sd=2))
# Change column name
colnames(df) <- "x"
# Calculate density
d <- density(df$x,na.rm=T)
# Check it (looks like a normalish distribution)
plot(d)
# As points
plot(d$x, d$y)
# Convert those points to a dataframe
d1 <- cbind(as.data.frame(d$x), as.data.frame(d$y))
colnames(d1) <- c("x", "y")
# Round x to 0.1
d1$x <- (round(d1$x,1))
# Aggregate by x, calling the new columns temperature and proportion
d2 <- aggregate(list(proportion=d1$y), by=list(temperature=d1$x), FUN="mean")
# Round
d2$proportion <- round(d2$proportion, 3)
d2$temperature <- round(d2$temperature, 1)
# Create a vector of temperatures from 0-30 in increments of 0.1
alltemps <- as.data.frame(seq(0,30, by=0.1))
# Change the column heading
colnames(alltemps) <- "temperature"
alltemps$temperature <- round(alltemps$temperature, 1)
# Merge the two datasets by temperature
d3 <- merge(alltemps, d2) #add back all.x=T if you want it
d3
> d3
temperature proportion
1 7.3 0.000
2 7.4 0.000
3 7.5 0.000
4 7.6 0.000
5 7.7 0.000
6 7.8 0.000
7 7.9 0.001
8 8.0 0.001
9 8.1 0.001
10 8.2 0.001
11 8.3 0.002
12 8.4 0.002
13 8.5 0.002
14 8.6 0.003
15 8.7 0.003
16 8.8 0.004
17 8.9 0.004
18 9.0 0.005
19 9.1 0.005
20 9.2 0.006
21 9.3 0.006
22 9.4 0.006
23 9.5 0.006
24 9.6 0.007
25 9.7 0.007
26 9.8 0.007
27 9.9 0.007
28 10.0 0.008
29 10.1 0.008
30 10.2 0.008
31 10.3 0.009
32 10.4 0.010
33 10.5 0.011
34 10.6 0.012
35 10.7 0.013
36 10.8 0.015
37 10.9 0.017
38 11.0 0.019
39 11.1 0.022
40 11.2 0.025
41 11.3 0.028
42 11.4 0.031
43 11.5 0.035
44 11.6 0.039
45 11.7 0.043
46 11.8 0.047
47 11.9 0.051
48 12.0 0.055
49 12.1 0.059
50 12.2 0.062
51 12.3 0.066
52 12.4 0.070
53 12.5 0.074
54 12.6 0.078
55 12.7 0.082
56 12.8 0.086
57 12.9 0.091
58 13.0 0.096
59 13.1 0.101
60 13.2 0.108
61 13.3 0.114
62 13.4 0.120
63 13.5 0.128
64 13.6 0.135
65 13.7 0.141
66 13.8 0.148
67 13.9 0.154
68 14.0 0.159
69 14.1 0.164
70 14.2 0.167
71 14.3 0.170
72 14.4 0.172
73 14.5 0.173
74 14.6 0.173
75 14.7 0.172
76 14.8 0.172
77 14.9 0.171
78 15.0 0.170
79 15.1 0.169
80 15.2 0.168
81 15.3 0.168
82 15.4 0.168
83 15.5 0.168
84 15.6 0.169
85 15.7 0.169
86 15.8 0.170
87 15.9 0.171
88 16.0 0.171
89 16.1 0.171
90 16.2 0.171
91 16.3 0.170
92 16.4 0.168
93 16.5 0.165
94 16.6 0.163
95 16.7 0.159
96 16.8 0.155
97 16.9 0.150
98 17.0 0.145
99 17.1 0.141
100 17.2 0.136
101 17.3 0.131
102 17.4 0.126
103 17.5 0.121
104 17.6 0.116
105 17.7 0.111
106 17.8 0.106
107 17.9 0.101
108 18.0 0.096
109 18.1 0.091
110 18.2 0.086
111 18.3 0.082
112 18.4 0.076
113 18.5 0.071
114 18.6 0.067
115 18.7 0.062
116 18.8 0.057
117 18.9 0.053
118 19.0 0.049
119 19.1 0.044
120 19.2 0.041
121 19.3 0.037
122 19.4 0.034
123 19.5 0.032
124 19.6 0.029
125 19.7 0.026
126 19.8 0.024
127 19.9 0.022
128 20.0 0.020
129 20.1 0.019
130 20.2 0.017
131 20.3 0.015
132 20.4 0.014
133 20.5 0.012
134 20.6 0.011
135 20.7 0.010
136 20.8 0.009
137 20.9 0.008
138 21.0 0.006
139 21.1 0.005
140 21.2 0.005
141 21.3 0.004
142 21.4 0.003
143 21.5 0.002
144 21.6 0.002
145 21.7 0.001
146 21.8 0.001
147 21.9 0.001
148 22.0 0.001
149 22.1 0.000
150 22.2 0.000
151 22.3 0.000
152 22.4 0.000
153 22.5 0.000
nrow(d3) == length(intersect(alltemps$temperature, d2$temperature))
[1] TRUE
中跳过匹配的值。
问题出在浮点长度上(不是显示的精度,而是用于合并的真实长度)。我通过在合并之前以相同的方式舍入两个温度值来修复它。
public void setView(Activity activity, View view) {
activity.runOnUiThread(new Runnable() {
public void run()
{
/update your view here
}
});
}
答案 1 :(得分:0)
参数all.x
告诉merge
保留所有来自alltemps的值,而不是来自d2。请尝试以下方法:
d3 <- merge(alltemps, d2, all = T)
如果您指定all = TRUE
,则merge
将保留两个数据框中的所有值。作为旁注,您可以在创建数据框的同时定义列名,而不是单独分配它们:
df <- data.frame(x = rnorm(100, mean=15, sd=2))