仅使用0和1值转换数据集

时间:2018-04-02 11:03:23

标签: r data-transform

我不确定该怎么称呼,所以我会尝试用外行语来描述问题所在。我有一个只包含0和1的数据框。所以对于每个人而不是一个具有事实值的列(例如低价格,4个房间)我有

      V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20 V21
1     0  0  0  1  0  0  0  1  0   1   0   0   0   0   1   1   0   0   0   1   0
2     1  0  0  0  0  0  0  1  1   0   0   0   0   0   1   0   0   1   0   0   1
3     0  0  0  1  1  0  0  0  0   0   1   0   0   0   1   1   0   0   1   0   0
4     0  0  0  1  0  1  0  0  0   0   1   0   1   0   0   0   1   0   1   0   0

如何在R中转换数据集,以便创建新列(#number of rooms)并将1(在第4列)中的位置赋予vhigh值? 我有多个支出的varibales我需要这样做。 21列表示1000个观察值的6个变量。应该是这样的

     PurchaseP.   NumberofRooms ...
1.      vhigh.         4
2.      low.           4
3.      vhigh.         1
4.      vhigh.         2

这里只为前2个epxlenatory varibales做了,但基本上它重复这样,每个explenatory变量有3-4个可能的因果值。

V1:V4 =购买价格,V5:V8 =房间数量,V9:V11 =楼层,等等

在我看来,这样的事情可以起作用

  1. 创建一个if statemt,根据列位置给每个1一个值,例如。如果V4中的值= 1,则命名为“vhigh”。并为每个Vx执行此操作
  2. 然后组合每一列V1:V4,V5:V8,V9:V11(取决于它是否有3-4个可能的因子/整数值),同时忽略0值。
  3. 这会有用吗,还是有更简单的方法?如何在R中编码?

2 个答案:

答案 0 :(得分:0)

您可以使用与

类似的函数()
lapply(df, function(x) { %now x is a row
    idx = which(x == 1)[1] 
    return(idx)
    })

有趣的是,每行使用which(x ==1)。这将为您提供包含一个索引的所有索引的数组。第一个可以在您的情况下使用(假设您每行只有一个1)否则,需要讨论聚合。然后,通过为各种指数提供合理的名称,可以将生成的列转换为因子。

答案 1 :(得分:0)

如果数据集每行包含1个,这是一个非常简单的问题

根据您的图片显示您的数据(请编辑您的问题以放置代码而不是图片)

var getLink = (str) => {
  var matches = str.match(/(?<=(\[|\())([^\])]+)/g);

  var aHTML = "";
  if (matches && matches.length == 2) {
    aHTML = '<a href="' + matches[0] + '">' + matches[0] + '</a>'
  }
  return aHTML;
};

var replaceInline = (str) => {
   return str.replace( /\[[^\]]+\]\([^)]+\)/g, r => getLink(r) );
};

var sample = "Here is a link [url.com](url) inline";
console.log( replaceInline(sample) );

然后,您只需将您的列与房间号码相加作为重量

df = data.frame(r1 = 0, r2 = 1, r3 = 0)
rownames(df)<- 1