当前位置: 首页 > 知识库问答 >
问题:

根据查找值为列创建新名称

伊俊能
2023-03-14

我有一个2010年和2019年的土地覆盖类型的数据框架。Pland代表总的土地覆盖价值,1等于该特定区域相对于ID的100%。这些计算是事先进行的,id代表每个几何形状。

我想执行一个函数,该函数生成另一个具有以下描述性名称的列,其中*表示要替换的名称:

lc_names <- tibble(landcover = 0:15,
                   lc_name = c("*_to_water", 
                               "*_to_evergreen_needleleaf", 
                               "*_to_evergreen_broadleaf", 
                               "*_to_deciduous_needleleaf", 
                               "*_to_deciduous_broadleaf", 
                               "*_to_mixed_forest",
                               "*_to_closed_shrubland", 
                               "*_to_open_shrubland", 
                               "*_to_woody_savanna", 
                               "*_to_savanna", 
                               "*_to_grassland", 
                               "*_to_wetland", 
                               "*_to_cropland", 
                               "*_to_urban", 
                               "*_to_mosiac", 
                               "*_to_barren"))

#these names can be used to replace the star
lc_names <- tibble(landcover = 0:15,
                   lc_name = c("water", 
                               "evergreen_needleleaf", 
                               "evergreen_broadleaf", 
                               "deciduous_needleleaf", 
                               "deciduous_broadleaf", 
                               "mixed_forest",
                               "closed_shrubland", 
                               "open_shrubland", 
                               "woody_savanna", 
                               "savanna", 
                               "grassland", 
                               "wetland", 
                               "cropland", 
                               "urban", 
                               "mosiac", 
                               "barren"))
A tibble: 50 x 4
      id y2010 y2019  pland
   <int> <int> <int>  <dbl>
 1     1    12    12 1     
 2     2    12    12 1     
 3     3    12    12 1     
 4     4    12    12 1     
 5     5    12    12 1     
 6     6     3     5 0.0345
 7     6     9     9 0.0345
 8     6     9    10 0.0345
 9     6    10    12 0.0345
10     6    10    14 0.0345
# ... with 40 more rows
cropland_to_cropland
      id y2010 y2019  pland   lc_name
   <int> <int> <int>  <dbl>
 1     1    12    12 1      cropland_to_cropland
 2     2    12    12 1      cropland_to_cropland
 3     3    12    12 1      cropland_to_cropland
 4     4    12    12 1      cropland_to_cropland
 5     5    12    12 1      cropland_to_cropland
 6     6     3     5 0.0345 closed_shrubland_to_deciduous_broadleaf

可复制代码:

structure(list(id = c(1L, 2L, 3L, 4L, 5L, 6L, 6L, 6L, 6L, 6L, 
6L, 6L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 
18L, 19L, 20L, 21L, 22L, 23L, 23L, 23L, 24L, 24L, 25L, 25L, 25L, 
25L, 26L, 27L, 28L, 29L, 30L, 31L, 32L, 33L, 34L, 35L, 36L, 36L
), y2010 = c(12L, 12L, 12L, 12L, 12L, 3L, 9L, 9L, 10L, 10L, 12L, 
12L, 14L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 
12L, 12L, 12L, 12L, 12L, 10L, 12L, 12L, 10L, 12L, 10L, 10L, 12L, 
12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 8L, 10L
), y2019 = c(12L, 12L, 12L, 12L, 12L, 5L, 9L, 10L, 12L, 14L, 
12L, 12L, 9L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 
12L, 12L, 12L, 12L, 12L, 12L, 14L, 12L, 14L, 10L, 12L, 12L, 12L, 
12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 8L, 
14L), pland = c(1, 1, 1, 1, 1, 0.0344827586206897, 0.0344827586206897, 
0.0344827586206897, 0.0344827586206897, 0.0344827586206897, 0.758620689655172, 
0.0344827586206897, 0.0344827586206897, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 0.0344827586206897, 0.931034482758621, 
0.0344827586206897, 0.0344827586206897, 0.96551724137931, 0.0344827586206897, 
0.0344827586206897, 0.0344827586206897, 0.896551724137931, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 0.137931034482759, 0.0344827586206897
)), row.names = c(NA, -50L), class = c("tbl_df", "tbl", "data.frame"
))

共有1个答案

全宪
2023-03-14

用简单的子集--你基本上就快到了。

# using +1 because you've got this 0 in your values ... maybe reconsider this... :)
mydat$new_col <- 
  paste0(lc_names$lc_name[mydat$y2010 + 1], "_to_", lc_names$lc_name[mydat$y2019 + 1])

mydat
#> # A tibble: 50 x 5
#>       id y2010 y2019  pland new_col                             
#>    <int> <int> <int>  <dbl> <chr>                               
#>  1     1    12    12 1      cropland_to_cropland                
#>  2     2    12    12 1      cropland_to_cropland                
#>  3     3    12    12 1      cropland_to_cropland                
#>  4     4    12    12 1      cropland_to_cropland                
#>  5     5    12    12 1      cropland_to_cropland                
#>  6     6     3     5 0.0345 deciduous_needleleaf_to_mixed_forest
#>  7     6     9     9 0.0345 savanna_to_savanna                  
#>  8     6     9    10 0.0345 savanna_to_grassland                
#>  9     6    10    12 0.0345 grassland_to_cropland               
#> 10     6    10    14 0.0345 grassland_to_mosiac                 
#> # … with 40 more rows
 类似资料:
  • 我有一个包含1.6x10^8记录的data.table,我想根据值为1的指示器列名称创建一个新的字符列。 例如 我希望它尽可能的健壮和干净,并且只依赖于data.table语法和/或其他有用的包/函数(例如dcast);我想避免创建大量的用户定义函数,因为考虑到我的数据表的大小,运行这个函数需要非常长的时间。 我已经查看了其他帖子,但我无法找到与我的情况和所需输出相似的东西。 任何帮助将不胜感激。

  • 我有一个如下所示的数据表 它有代表名称的p列和代表值的t列。t1是对应于p1、t2到p2等的值... 在每一行上,p列的值都是唯一的(或)。t列中的值也是如此。 我要做的是创建三个新列: ,每行所有t列的最小值(不包括NA) ,如果t_min存在(不是NA),则p列的对应值…因此,如果t2列具有t-min值,则列的对应值 ,具有p_min值的列的名称。因此,如果p_min值来自column,则“p

  • 我想根据列_1和列_2或列_3中的值创建一个新列“column_new”。如果列_1=='C',则列_new的值与列_2相同,但如果列_1=='G',则列_new的值与列_3相同。 我试过: 错误:值错误:序列的真值不明确。使用a.empty、a.bool()、a.item()、a.any()或a.all()。 还尝试: 错误:值错误:数据帧的真值不明确。使用a.empty、a.bool()、a.

  • 我有一个数据框如下所示 我想增加两列, 第一个名为“活动”的开关将值切换为1(如果为df.value 我尝试使用for循环,但当时间序列很长时,它会占用太多时间。有人知道更好的方法吗?谢谢你的进步!

  • Class类提供很多方法用于获取类的各种信息,比如获取类名、判断该类是否是一个接口还是普通类等等。在Java中枚举类是一种类,而注解是一个接口,数组也是一个类;Java原始类型(boolean, byte, char, short, int, long, float, and double)和关键字void也被表示为Class的对象。

  • 问题内容: 我想申请我的自定义函数(它使用的梯)这六个列我的数据帧的每一行中)。 我尝试了与其他问题不同的方法,但似乎仍然找不到适合我问题的正确答案。关键在于,如果该人被视为西班牙裔,就不能被视为其他任何人。即使他们在另一个种族栏中的得分为“ 1”,他们仍然被视为西班牙裔,而不是两个或两个以上的种族。同样,如果所有ERI列的总和大于1,则将它们计为两个或多个种族,并且不能计为唯一的种族(西班牙裔除