【发布时间】:2020-05-23 02:35:38
【问题描述】:
我正在尝试更改包含数千行的数据框,每行看起来都像以下变体之一:
table, th, td {
border: 1px solid black
}
<table>
<tr>
<th> a </th>
<th> b </th>
<th> c </th>
</tr>
<tr>
<td> $10 x and $7 y </td>
<td> NA </td>
<td> NA </td>
</tr>
<tr>
<td> $70 a; $95 b </td>
<td> NA </td>
<td> NA </td>
</tr>
<tr>
<td> $6 j </td>
<td> NA </td>
<td> NA </td>
</tr>
</table>
并将其更改为:
table, th, td {
border: 1px solid black
}
<table>
<tr>
<th> a </th>
<th> b </th>
<th> c </th>
</tr>
<tr>
<td> $10 x and $7 y </td>
<td> $10 x </td>
<td> $7 y </td>
</tr>
<tr>
<td> $70 a; $95 b </td>
<td> $70 a </td>
<td> $95 b </td>
</tr>
<tr>
<td> $6 j </td>
<td> $6 j </td>
<td> NA </td>
</tr>
</table>
这是我当前的代码来实现这一点(我使用美元符号的数量,因为这是确定交易数量的唯一一致值):
(这是格式化为 data.table,以防万一)
df$b[(str_count(df$a, pattern = "\\$") == 2)] = unlist(strsplit(df$a, " and "))[1]
df$c[(str_count(df$a, pattern = "\\$") == 2)] = unlist(strsplit(df$a, " and "))[2]
df$b[str_count(df$a, pattern = "\\$") < 2] = df$a
现在,我得到的不是预期的结果:
table, th, td {
border: 1px solid black
}
<table>
<tr>
<th> a </th>
<th> b </th>
<th> c </th>
</tr>
<tr>
<td> $10 x and $7 y </td>
<td> $10 x </td>
<td> $7 y </td>
</tr>
<tr>
<td> $70 a; $95 b </td>
<td> $10 x</td>
<td> $7 y</td>
</tr>
<tr>
<td> $6 j </td>
<td> $6 j </td>
<td> NA </td>
</tr>
</table>
有谁知道如何解决这个问题?我认为这与strsplit() 将第一个子集行并将其应用于子集中的每一行这一事实有关,但我不知道如何更改它以使其正常工作。
【问题讨论】:
标签: r data.table strsplit