我有这个数据框架df:
df<-structure(list(hex = 1:6, tile_type_index = c(9L, 10L, 5L, 9L,
3L, 2L)), class = "data.frame", row.names = c(NA, -6L))
hex tile_type_index
1 1 9
2 2 10
3 3 5
4 4 9
5 5 3
6 6 2
我想添加一个名为material的新列,如下所示:
hex tile_type_index material
1 1 9 0, 0, 0, 0, 0, 0, 0, 0, 1000, 0
2 2 10 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
3 3 5 0, 0, 0, 0, 1000, 0, 0, 0, 0, 0
4 4 9 0, 0, 0, 0, 0, 0, 0, 0, 1000, 0
5 5 3 0, 0, 1000, 0, 0, 0, 0, 0, 0, 0
6 6 2 0, 1000, 0, 0, 0, 0, 0, 0, 0, 0
列材料的规则是,它是一个长度为10的向量,其中具有tile_type_index给出的索引的向量中的元素为1000,其余为0。除非tile_type_index==10,在这种情况下,vector中的所有元素都为0。
我如何生成这个列?
一个可能的方法来解决你的问题:
# way 1
df$material = lapply(df$tile_type_index, (x) match(1:10, x, 0, 10) * 1000)
# way 2
df$material = lapply(df$tile_type_index, (x) (x!=10 & x==1:10) * 1000)
# hex tile_type_index material
# 1 1 9 0, 0, 0, 0, 0, 0, 0, 0, 1000, 0
# 2 2 10 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
# 3 3 5 0, 0, 0, 0, 1000, 0, 0, 0, 0, 0
# 4 4 9 0, 0, 0, 0, 0, 0, 0, 0, 1000, 0
# 5 5 3 0, 0, 1000, 0, 0, 0, 0, 0, 0, 0
# 6 6 2 0, 1000, 0, 0, 0, 0, 0, 0, 0, 0
你可以试试
library(dplyr)
df %>%
rowwise %>%
mutate(material = list(1000 * replace_na(match(1:10, ifelse(tile_type_index == 10, 0, tile_type_index)), 0))
%>% as.character() # to see it's value
)
hex tile_type_index material
<int> <int> <chr>
1 1 9 c(0, 0, 0, 0, 0, 0, 0, 0, 1000, 0)
2 2 10 c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
3 3 5 c(0, 0, 0, 0, 1000, 0, 0, 0, 0, 0)
4 4 9 c(0, 0, 0, 0, 0, 0, 0, 0, 1000, 0)
5 5 3 c(0, 0, 1000, 0, 0, 0, 0, 0, 0, 0)
6 6 2 c(0, 1000, 0, 0, 0, 0, 0, 0, 0, 0)
df<-structure(list(hex = 1:6, tile_type_index = c(9L, 10L, 5L, 9L, 3L, 2L), material = matrix(0,6,10)), class = "data.frame", row.names = c(NA, -6L))
for(i in 1:6){
if(df$tile_type_index[i] != 10){
df$material[i,df$tile_type_inde[i]] <- 1000
}
}
df
hex tile_type_index material
<int> <int> <dbl[,10]>
1 9 0, 0, 0, 0, 0, 0, 0, 0, 1000, 0
2 10 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
3 5 0, 0, 0, 0, 1000, 0, 0, 0, 0, 0
4 9 0, 0, 0, 0, 0, 0, 0, 0, 1000, 0
5 3 0, 0, 1000, 0, 0, 0, 0, 0, 0, 0
6 2 0, 1000, 0, 0, 0, 0, 0, 0, 0, 0
这个怎么样
我们可以用tabulate
mx <- max(df$tile_type_index)
df$material <- lapply(df$tile_type_index, (x) tabulate(x, mx) * 1000)
与产出
> df
hex tile_type_index material
1 1 9 0, 0, 0, 0, 0, 0, 0, 0, 1000, 0
2 2 10 0, 0, 0, 0, 0, 0, 0, 0, 0, 1000
3 3 5 0, 0, 0, 0, 1000, 0, 0, 0, 0, 0
4 4 9 0, 0, 0, 0, 0, 0, 0, 0, 1000, 0
5 5 3 0, 0, 1000, 0, 0, 0, 0, 0, 0, 0
6 6 2 0, 1000, 0, 0, 0, 0, 0, 0, 0, 0