R数据框中的新列,该列包含使用其他列的条件生成的向量



我有这个数据框架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

最新更新